From 663979d09e029ea170ad65cd3ee3203af2cb6819 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Thu, 12 Mar 2026 22:11:07 +0100 Subject: [PATCH 01/18] feat(android): align setup to create-react-native-library latest init --- android/build.gradle | 93 ++++--------------- android/gradle.properties | 15 +-- android/src/main/AndroidManifest.xml | 3 +- android/src/main/AndroidManifestNew.xml | 2 - .../OrientationDirectorModule.kt | 0 .../src/oldarch/OrientationDirectorModule.kt | 66 ------------- 6 files changed, 25 insertions(+), 154 deletions(-) delete mode 100644 android/src/main/AndroidManifestNew.xml rename android/src/{newarch => main/java/com/orientationdirector}/OrientationDirectorModule.kt (100%) delete mode 100644 android/src/oldarch/OrientationDirectorModule.kt diff --git a/android/build.gradle b/android/build.gradle index c2c7762..73cd89a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,6 +1,17 @@ buildscript { - ext.getExtOrDefault = {name -> - return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['OrientationDirector_' + name] + ext.OrientationDirector = [ + kotlinVersion: "2.0.21", + minSdkVersion: 24, + compileSdkVersion: 36, + targetSdkVersion: 36 + ] + + ext.getExtOrDefault = { prop -> + if (rootProject.ext.has(prop)) { + return rootProject.ext.get(prop) + } + + return OrientationDirector[prop] } repositories { @@ -16,51 +27,19 @@ buildscript { } -def isNewArchitectureEnabled() { - return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true" -} - apply plugin: "com.android.library" apply plugin: "kotlin-android" -if (isNewArchitectureEnabled()) { - apply plugin: "com.facebook.react" -} - -def getExtOrIntegerDefault(name) { - return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["OrientationDirector_" + name]).toInteger() -} - -def getDefault(name) { - return project.properties["OrientationDirector_" + name] -} - -def supportsNamespace() { - def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.') - def major = parsed[0].toInteger() - def minor = parsed[1].toInteger() - - // Namespace support was added in 7.3.0 - return (major == 7 && minor >= 3) || major >= 8 -} +apply plugin: "com.facebook.react" android { - if (supportsNamespace()) { - namespace "com.orientationdirector" + namespace "com.orientationdirector" - sourceSets { - main { - manifest.srcFile "src/main/AndroidManifestNew.xml" - } - } - } - - compileSdkVersion getExtOrIntegerDefault("compileSdkVersion") + compileSdkVersion getExtOrDefault("compileSdkVersion") defaultConfig { - minSdkVersion getExtOrIntegerDefault("minSdkVersion") - targetSdkVersion getExtOrIntegerDefault("targetSdkVersion") - buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() + minSdkVersion getExtOrDefault("minSdkVersion") + targetSdkVersion getExtOrDefault("targetSdkVersion") } buildFeatures { @@ -73,7 +52,7 @@ android { } } - lintOptions { + lint { disable "GradleCompatible" } @@ -81,47 +60,13 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } - - sourceSets { - main { - if (isNewArchitectureEnabled()) { - java.srcDirs += [ - "src/newarch", - // This is needed to build Kotlin project with NewArch enabled - "${project.buildDir}/generated/source/codegen/java" - ] - } else { - java.srcDirs += ["src/oldarch"] - } - } - } } -repositories { - mavenCentral() - google() -} - -def kotlin_version = getExtOrDefault("kotlinVersion") -def junit_version = getDefault("junitVersion") -def android_x_core_version = getDefault("androidXCoreVersion") -def robolectric_version = getDefault("robolectricVersion") -def mockito_core_version = getDefault("mockitoCoreVersion") - dependencies { implementation "com.facebook.react:react-android" - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" testImplementation "junit:junit:$junit_version" testImplementation "androidx.test:core:$android_x_core_version" testImplementation "org.robolectric:robolectric:$robolectric_version" testImplementation "org.mockito:mockito-core:$mockito_core_version" } - -if (isNewArchitectureEnabled()) { - react { - jsRootDir = file("../src/") - libraryName = "OrientationDirector" - codegenJavaPackageName = "com.orientationdirector" - } -} diff --git a/android/gradle.properties b/android/gradle.properties index 7beae3d..76859fb 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,17 +1,12 @@ -OrientationDirector_kotlinVersion=2.0.21 -OrientationDirector_minSdkVersion=24 -OrientationDirector_targetSdkVersion=34 -OrientationDirector_compileSdkVersion=35 -OrientationDirector_ndkVersion=27.1.12297006 - ######################### # TESTING # -OrientationDirector_junitVersion=4.13.2 -OrientationDirector_androidXCoreVersion=1.5.+ -OrientationDirector_robolectricVersion=4.13 -OrientationDirector_mockitoCoreVersion=5.14.2 +junit_version=4.13.2 +android_x_core_version=1.5.+ +robolectric_version=4.13 +mockito_core_version=5.14.2 # ######################### + diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index e238a8f..a2f47b6 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,3 +1,2 @@ - + diff --git a/android/src/main/AndroidManifestNew.xml b/android/src/main/AndroidManifestNew.xml deleted file mode 100644 index a2f47b6..0000000 --- a/android/src/main/AndroidManifestNew.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/android/src/newarch/OrientationDirectorModule.kt b/android/src/main/java/com/orientationdirector/OrientationDirectorModule.kt similarity index 100% rename from android/src/newarch/OrientationDirectorModule.kt rename to android/src/main/java/com/orientationdirector/OrientationDirectorModule.kt diff --git a/android/src/oldarch/OrientationDirectorModule.kt b/android/src/oldarch/OrientationDirectorModule.kt deleted file mode 100644 index b9761eb..0000000 --- a/android/src/oldarch/OrientationDirectorModule.kt +++ /dev/null @@ -1,66 +0,0 @@ -package com.orientationdirector - -import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.bridge.ReactContextBaseJavaModule -import com.facebook.react.bridge.Promise -import com.facebook.react.bridge.ReactMethod -import com.orientationdirector.implementation.OrientationDirectorModuleImpl - -class OrientationDirectorModule internal constructor(context: ReactApplicationContext) : - ReactContextBaseJavaModule(context) { - - private var implementation = OrientationDirectorModuleImpl(context) - - override fun getName() = OrientationDirectorModuleImpl.NAME - - @ReactMethod() - fun getInterfaceOrientation(promise: Promise) { - promise.resolve(implementation.getInterfaceOrientation().ordinal) - } - - @ReactMethod() - fun getDeviceOrientation(promise: Promise) { - promise.resolve(implementation.getDeviceOrientation().ordinal) - } - - @ReactMethod() - fun lockTo(orientation: Double) { - implementation.lockTo(orientation.toInt()) - } - - @ReactMethod() - fun unlock() { - implementation.unlock() - } - - @ReactMethod() - fun resetSupportedInterfaceOrientations() { - implementation.resetSupportedInterfaceOrientations() - } - - @ReactMethod(isBlockingSynchronousMethod = true) - fun isLocked(): Boolean { - return implementation.getIsLocked() - } - - @ReactMethod(isBlockingSynchronousMethod = true) - fun isAutoRotationEnabled(): Boolean { - return implementation.getIsAutoRotationEnabled() - } - - @ReactMethod() - fun enableOrientationSensors() { - return implementation.enableOrientationSensors() - } - - @ReactMethod() - fun disableOrientationSensors() { - return implementation.disableOrientationSensors() - } - - @ReactMethod() - fun addListener(eventName: String) {} - - @ReactMethod() - fun removeListeners(count: Double) {} -} From fea60fcad3cf4ebd7c4e1053a767d71b0c7cd3d5 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Thu, 12 Mar 2026 22:18:12 +0100 Subject: [PATCH 02/18] feat(android): rework module and package to align with documentation --- .../OrientationDirectorModule.kt | 17 +++++---- .../OrientationDirectorPackage.kt | 35 ++++++++----------- 2 files changed, 23 insertions(+), 29 deletions(-) diff --git a/android/src/main/java/com/orientationdirector/OrientationDirectorModule.kt b/android/src/main/java/com/orientationdirector/OrientationDirectorModule.kt index a1beb49..25dcb15 100644 --- a/android/src/main/java/com/orientationdirector/OrientationDirectorModule.kt +++ b/android/src/main/java/com/orientationdirector/OrientationDirectorModule.kt @@ -4,34 +4,29 @@ import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext import com.orientationdirector.implementation.OrientationDirectorModuleImpl -class OrientationDirectorModule internal constructor(context: ReactApplicationContext) : - NativeOrientationDirectorSpec(context) { +class OrientationDirectorModule(reactContext: ReactApplicationContext) : + NativeOrientationDirectorSpec(reactContext) { - private var implementation = OrientationDirectorModuleImpl(context) - - override fun getName() = OrientationDirectorModuleImpl.NAME + override fun getName() = NAME + private var implementation = OrientationDirectorModuleImpl(reactContext) override fun getInterfaceOrientation(promise: Promise) { promise.resolve(implementation.getInterfaceOrientation().ordinal) } - override fun getDeviceOrientation(promise: Promise) { promise.resolve(implementation.getDeviceOrientation().ordinal) } - override fun lockTo(orientation: Double) { implementation.lockTo(orientation.toInt()) } - override fun unlock() { implementation.unlock() } - override fun resetSupportedInterfaceOrientations() { implementation.resetSupportedInterfaceOrientations() } @@ -56,4 +51,8 @@ class OrientationDirectorModule internal constructor(context: ReactApplicationCo override fun removeListeners(count: Double) {} + companion object { + const val NAME = OrientationDirectorModuleImpl.NAME + } + } diff --git a/android/src/main/java/com/orientationdirector/OrientationDirectorPackage.kt b/android/src/main/java/com/orientationdirector/OrientationDirectorPackage.kt index 78bda91..3812617 100644 --- a/android/src/main/java/com/orientationdirector/OrientationDirectorPackage.kt +++ b/android/src/main/java/com/orientationdirector/OrientationDirectorPackage.kt @@ -1,35 +1,30 @@ package com.orientationdirector import com.facebook.react.BaseReactPackage -import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.NativeModule -import com.facebook.react.module.model.ReactModuleInfoProvider +import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.module.model.ReactModuleInfo -import com.orientationdirector.implementation.OrientationDirectorModuleImpl -import java.util.HashMap +import com.facebook.react.module.model.ReactModuleInfoProvider class OrientationDirectorPackage : BaseReactPackage() { - override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? { - return if (name == OrientationDirectorModuleImpl.NAME) { + + override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? = + if (name == OrientationDirectorModule.NAME) { OrientationDirectorModule(reactContext) } else { null } - } - override fun getReactModuleInfoProvider(): ReactModuleInfoProvider { - return ReactModuleInfoProvider { - val moduleInfos: MutableMap = HashMap() - val isTurboModule: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - moduleInfos[OrientationDirectorModuleImpl.NAME] = ReactModuleInfo( - OrientationDirectorModuleImpl.NAME, - OrientationDirectorModuleImpl.NAME, - false, // canOverrideExistingModule - false, // needsEagerInit - false, // isCxxModule - isTurboModule // isTurboModule + override fun getReactModuleInfoProvider() = ReactModuleInfoProvider { + mapOf( + OrientationDirectorModule.NAME to ReactModuleInfo( + name = OrientationDirectorModule.NAME, + className = OrientationDirectorModule.NAME, + canOverrideExistingModule = false, + needsEagerInit = false, + isCxxModule = false, + isTurboModule = true ) - moduleInfos - } + ) } } From 42478dcffa08a508961797a8ce964da63533c423 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Thu, 12 Mar 2026 22:26:11 +0100 Subject: [PATCH 03/18] feat(iOS): align implementation to latest documentation --- ios/OrientationDirector.h | 12 +----- ios/OrientationDirector.mm | 41 +++++++++++-------- ...ive-orientation-director-Bridging-Header.h | 6 --- package.json | 5 +++ 4 files changed, 32 insertions(+), 32 deletions(-) delete mode 100644 ios/react-native-orientation-director-Bridging-Header.h diff --git a/ios/OrientationDirector.h b/ios/OrientationDirector.h index 9c326fe..abafefb 100644 --- a/ios/OrientationDirector.h +++ b/ios/OrientationDirector.h @@ -1,22 +1,14 @@ #import - -#ifdef RCT_NEW_ARCH_ENABLED #import NS_ASSUME_NONNULL_BEGIN @interface OrientationDirector : RCTEventEmitter -NS_ASSUME_NONNULL_END - -#else -#import - -@interface OrientationDirector : RCTEventEmitter -#endif - @property (nonatomic, assign) BOOL isJsListening; +(UIInterfaceOrientationMask)getSupportedInterfaceOrientationsForWindow; @end + +NS_ASSUME_NONNULL_END diff --git a/ios/OrientationDirector.mm b/ios/OrientationDirector.mm index 8ced579..d82e28d 100644 --- a/ios/OrientationDirector.mm +++ b/ios/OrientationDirector.mm @@ -21,7 +21,6 @@ @interface OrientationDirector() ////////////////////////////////////////////////////////////////////////////////////////// @implementation OrientationDirector -RCT_EXPORT_MODULE() - (instancetype)init { @@ -70,28 +69,29 @@ - (void)sendEventWithName:(NSString * _Nonnull)name params:(NSDictionary *)param /////////////////////////////////////////////////////////////////////////////////////// /// EXPORTED METHODS /// -RCT_EXPORT_METHOD(getInterfaceOrientation:(RCTPromiseResolveBlock)resolve - reject:(RCTPromiseRejectBlock)reject) + +- (void)getInterfaceOrientation:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { dispatch_async(dispatch_get_main_queue(), ^{ resolve(@([_director getInterfaceOrientation])); }); } -RCT_EXPORT_METHOD(getDeviceOrientation:(RCTPromiseResolveBlock)resolve - reject:(RCTPromiseRejectBlock)reject) +- (void)getDeviceOrientation:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { dispatch_async(dispatch_get_main_queue(), ^{ resolve(@([_director getDeviceOrientation])); }); } -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isLocked) +- (NSNumber *)isLocked { return @([_director getIsLocked]); } -RCT_EXPORT_METHOD(lockTo:(double)jsOrientation) +- (void)lockTo:(double)jsOrientation { NSNumber *jsOrientationNumber = @(jsOrientation); dispatch_async(dispatch_get_main_queue(), ^{ @@ -99,37 +99,46 @@ - (void)sendEventWithName:(NSString * _Nonnull)name params:(NSDictionary *)param }); } -RCT_EXPORT_METHOD(unlock) +- (void)unlock { dispatch_async(dispatch_get_main_queue(), ^{ [_director unlock]; }); } -RCT_EXPORT_METHOD(resetSupportedInterfaceOrientations) +- (void)resetSupportedInterfaceOrientations { dispatch_async(dispatch_get_main_queue(), ^{ [_director resetSupportedInterfaceOrientations]; }); } -/** - This method is a pure stub since we cannot access auto rotation setting in iOS - */ -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isAutoRotationEnabled) +/////////////////////////////////////////////////////////////////////////////////////// +/// STUBS +/// + +- (NSNumber *)isAutoRotationEnabled { return @(NO); } + +- (void)disableOrientationSensors {} + + +- (void)enableOrientationSensors {} + /// /////////////////////////////////////////////////////////////////////////////////////// -// Don't compile this code when we build for the old architecture. -#ifdef RCT_NEW_ARCH_ENABLED - (std::shared_ptr)getTurboModule: (const facebook::react::ObjCTurboModule::InitParams &)params { return std::make_shared(params); } -#endif + ++ (NSString *)moduleName +{ + return @"OrientationDirector"; +} @end diff --git a/ios/react-native-orientation-director-Bridging-Header.h b/ios/react-native-orientation-director-Bridging-Header.h deleted file mode 100644 index 43ded88..0000000 --- a/ios/react-native-orientation-director-Bridging-Header.h +++ /dev/null @@ -1,6 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - -#import "React/RCTBridgeModule.h" -#import "React/RCTEventEmitter.h" diff --git a/package.json b/package.json index b20b2f7..e5bb3ec 100644 --- a/package.json +++ b/package.json @@ -127,6 +127,11 @@ "jsSrcsDir": "src", "android": { "javaPackageName": "com.orientationdirector" + }, + "ios": { + "modulesProvider": { + "OrientationDirector": "OrientationDirector" + } } }, "jest": { From 89913ea897ddeb91de194067186dc37218543382 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sat, 14 Mar 2026 22:05:24 +0100 Subject: [PATCH 04/18] fix(iOS): broken build due to .mm used in .swift file --- .../OrientationDirectorExample-Bridging-Header.h | 5 ----- .../project.pbxproj | 4 ---- .../OrientationDirectorExample/AppDelegate.swift | 3 ++- example/ios/Podfile.lock | 2 +- ios/OrientationDirector.h | 2 -- ios/OrientationDirector.mm | 13 ++++--------- ios/SharedOrientationDirectorImpl.swift | 12 ++++++++++++ react-native-orientation-director.podspec | 4 +++- 8 files changed, 22 insertions(+), 23 deletions(-) delete mode 100644 example/ios/OrientationDirectorExample-Bridging-Header.h create mode 100644 ios/SharedOrientationDirectorImpl.swift diff --git a/example/ios/OrientationDirectorExample-Bridging-Header.h b/example/ios/OrientationDirectorExample-Bridging-Header.h deleted file mode 100644 index 0377173..0000000 --- a/example/ios/OrientationDirectorExample-Bridging-Header.h +++ /dev/null @@ -1,5 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - -#import "OrientationDirector.h" diff --git a/example/ios/OrientationDirectorExample.xcodeproj/project.pbxproj b/example/ios/OrientationDirectorExample.xcodeproj/project.pbxproj index b5d2ca2..9bcdab6 100644 --- a/example/ios/OrientationDirectorExample.xcodeproj/project.pbxproj +++ b/example/ios/OrientationDirectorExample.xcodeproj/project.pbxproj @@ -20,7 +20,6 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = OrientationDirectorExample/Info.plist; sourceTree = ""; }; 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = OrientationDirectorExample/PrivacyInfo.xcprivacy; sourceTree = ""; }; 1B92D7FA4703F1B0B676C06C /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = OrientationDirectorExample/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 2A603DD92D59212A00CE7330 /* OrientationDirectorExample-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OrientationDirectorExample-Bridging-Header.h"; sourceTree = ""; }; 2A603DDA2D59212A00CE7330 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = OrientationDirectorExample/AppDelegate.swift; sourceTree = ""; }; 3B4392A12AC88292D35C810B /* Pods-OrientationDirectorExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OrientationDirectorExample.debug.xcconfig"; path = "Target Support Files/Pods-OrientationDirectorExample/Pods-OrientationDirectorExample.debug.xcconfig"; sourceTree = ""; }; 5709B34CF0A7D63546082F79 /* Pods-OrientationDirectorExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OrientationDirectorExample.release.xcconfig"; path = "Target Support Files/Pods-OrientationDirectorExample/Pods-OrientationDirectorExample.release.xcconfig"; sourceTree = ""; }; @@ -50,7 +49,6 @@ 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */, 1B92D7FA4703F1B0B676C06C /* PrivacyInfo.xcprivacy */, 2A603DDA2D59212A00CE7330 /* AppDelegate.swift */, - 2A603DD92D59212A00CE7330 /* OrientationDirectorExample-Bridging-Header.h */, ); name = OrientationDirectorExample; sourceTree = ""; @@ -280,7 +278,6 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = OrientationDirectorExample; - SWIFT_OBJC_BRIDGING_HEADER = "OrientationDirectorExample-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -309,7 +306,6 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = OrientationDirectorExample; - SWIFT_OBJC_BRIDGING_HEADER = "OrientationDirectorExample-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; diff --git a/example/ios/OrientationDirectorExample/AppDelegate.swift b/example/ios/OrientationDirectorExample/AppDelegate.swift index df1be9b..827f7f7 100644 --- a/example/ios/OrientationDirectorExample/AppDelegate.swift +++ b/example/ios/OrientationDirectorExample/AppDelegate.swift @@ -2,6 +2,7 @@ import UIKit import React import React_RCTAppDelegate import ReactAppDependencyProvider +import OrientationDirector @main class AppDelegate: UIResponder, UIApplicationDelegate { @@ -33,7 +34,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { - return OrientationDirector.getSupportedInterfaceOrientationsForWindow() + return SharedOrientationDirectorImpl.shared.supportedInterfaceOrientations } } diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 79f4422..f6316ed 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2198,7 +2198,7 @@ SPEC CHECKSUMS: React-logger: b5521614afb8690420146dfc61a1447bb5d65419 React-Mapbuffer: f4ee8c62e0ef8359d139124f35a471518a172cd3 React-microtasksnativemodule: d1956f0eec54c619b63a379520fb4c618a55ccb9 - react-native-orientation-director: 36f4d20897ec48fde3c59efb408b6662963f951c + react-native-orientation-director: c4e2817543eb548ede5bfe55f41065785f6c0287 react-native-safe-area-context: 97d5e41cca72acc2791faa48744ddb82ff554f82 React-NativeModulesApple: 5ba0903927f6b8d335a091700e9fda143980f819 React-networking: 3a4b7f9ed2b2d1c0441beacb79674323a24bcca6 diff --git a/ios/OrientationDirector.h b/ios/OrientationDirector.h index abafefb..96c8e51 100644 --- a/ios/OrientationDirector.h +++ b/ios/OrientationDirector.h @@ -7,8 +7,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) BOOL isJsListening; -+(UIInterfaceOrientationMask)getSupportedInterfaceOrientationsForWindow; - @end NS_ASSUME_NONNULL_END diff --git a/ios/OrientationDirector.mm b/ios/OrientationDirector.mm index d82e28d..60a89b3 100644 --- a/ios/OrientationDirector.mm +++ b/ios/OrientationDirector.mm @@ -4,13 +4,13 @@ This condition is needed to support use_frameworks. https://github.com/callstack/react-native-builder-bob/discussions/412#discussioncomment-6352402 */ -#if __has_include("react_native_orientation_director-Swift.h") -#import "react_native_orientation_director-Swift.h" +#if __has_include("OrientationDirector-Swift.h") +#import "OrientationDirector-Swift.h" #else -#import "react_native_orientation_director/react_native_orientation_director-Swift.h" +#import "OrientationDirector/OrientationDirector-Swift.h" #endif -static OrientationDirectorImpl *_director = [OrientationDirectorImpl new]; +static OrientationDirectorImpl *_director = SharedOrientationDirectorImpl.shared; /////////////////////////////////////////////////////////////////////////////////////// /// EVENT EMITTER SETUP @@ -40,11 +40,6 @@ + (BOOL)requiresMainQueueSetup return YES; } -+ (UIInterfaceOrientationMask)getSupportedInterfaceOrientationsForWindow -{ - return [_director supportedInterfaceOrientations]; -} - /////////////////////////////////////////////////////////////////////////////////////// /// EVENT EMITTER SETUP /// diff --git a/ios/SharedOrientationDirectorImpl.swift b/ios/SharedOrientationDirectorImpl.swift new file mode 100644 index 0000000..aa5eed0 --- /dev/null +++ b/ios/SharedOrientationDirectorImpl.swift @@ -0,0 +1,12 @@ +// +// SharedOrientationDirectorImpl.swift +// react-native-orientation-director +// +// Created by Mirko Quaglia on 14/03/26. +// + +import Foundation + +@objc public class SharedOrientationDirectorImpl: NSObject { + @objc public static let shared = OrientationDirectorImpl() +} diff --git a/react-native-orientation-director.podspec b/react-native-orientation-director.podspec index 419c0bb..0df669e 100644 --- a/react-native-orientation-director.podspec +++ b/react-native-orientation-director.podspec @@ -14,7 +14,9 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/gladiuscode/react-native-orientation-director.git", :tag => "#{s.version}" } s.source_files = "ios/**/*.{h,m,mm,swift,cpp}" - s.private_header_files = "ios/generated/**/*.h" + s.private_header_files = "ios/**/*.h" + + s.module_name = "OrientationDirector" install_modules_dependencies(s) end From 46e98bf06eddf76bf77d9171771635680f3276a5 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sat, 14 Mar 2026 22:09:55 +0100 Subject: [PATCH 05/18] chore: update README.md --- README.md | 39 +++++++++++---------------------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 39752cc..3d529b4 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,10 @@ A React Native library that allows you to listen to orientation changes, lock interface orientation to a selected one and get current orientation. -Written in Kotlin, Swift and Typescript. It supports both the Old and New React Native architecture. +Written in Kotlin, Swift and Typescript. + +Kindly note that this library only supports the new architecture since v3.0.0, if you are looking for a version that +supports the old architecture, please check older versions. This library takes inspiration from and builds upon the following amazing alternatives: @@ -112,40 +115,20 @@ Nothing else is required for Android. #### iOS -To properly handle interface orientation changes in iOS, you need to update your AppDelegate file. Since React Native -0.77, the AppDelegate has been migrated to Swift, so see the instructions below for both Swift and Objective-C. - -##### Objective-C - -In your AppDelegate.mm file, import "OrientationDirector.h" and implement supportedInterfaceOrientationsForWindow method as follows: +To properly handle interface orientation changes in iOS, you need to update your AppDelegate file. Follow the instructions +below to set it up: -```objc -#import - -- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window -{ - return [OrientationDirector getSupportedInterfaceOrientationsForWindow]; -} -``` - -##### Swift +Then, in your AppDelegate.swift file, implement the supportedInterfaceOrientationsFor method as follows: -You need to create a [bridging header](https://developer.apple.com/documentation/swift/importing-objective-c-into-swift#Import-Code-Within-an-App-Target) -to import the library, as shown below: +```swift -``` #import "OrientationDirector.h" -``` - -Then, in your AppDelegate.swift file, implement the supportedInterfaceOrientationsFor method as follows: -```swift -override func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { - return OrientationDirector.getSupportedInterfaceOrientationsForWindow() +func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { + return SharedOrientationDirectorImpl.shared.supportedInterfaceOrientations } -``` -Note: if you are targeting react-native > 79.x, you can omit the `override` keyword. +``` If you need help, you can check the example project. From e929bb2053b0234f75b3272c28e749698e83d0d1 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sat, 14 Mar 2026 22:56:49 +0100 Subject: [PATCH 06/18] feat(expo): align test suite to latest changes --- .../withRNOrientationAppDelegate.spec.ts.snap | 104 +++--------------- ...thRNOrientationBridgingHeader.spec.ts.snap | 9 -- plugin/__tests__/fixtures/AppDelegate.mm | 62 ----------- plugin/__tests__/fixtures/Bridging-Header.h | 3 - .../withRNOrientationAppDelegate.spec.ts | 9 -- .../withRNOrientationBridgingHeader.spec.ts | 24 ---- plugin/src/custom-mod/withBridgingHeader.ts | 91 --------------- plugin/src/index.ts | 4 - plugin/src/withRNOrientationAppDelegate.ts | 100 +++++------------ plugin/src/withRNOrientationBridgingHeader.ts | 40 ------- 10 files changed, 45 insertions(+), 401 deletions(-) delete mode 100644 plugin/__tests__/__snapshots__/withRNOrientationBridgingHeader.spec.ts.snap delete mode 100644 plugin/__tests__/fixtures/AppDelegate.mm delete mode 100644 plugin/__tests__/fixtures/Bridging-Header.h delete mode 100644 plugin/__tests__/withRNOrientationBridgingHeader.spec.ts delete mode 100644 plugin/src/custom-mod/withBridgingHeader.ts delete mode 100644 plugin/src/withRNOrientationBridgingHeader.ts diff --git a/plugin/__tests__/__snapshots__/withRNOrientationAppDelegate.spec.ts.snap b/plugin/__tests__/__snapshots__/withRNOrientationAppDelegate.spec.ts.snap index ccc4a04..a47c446 100644 --- a/plugin/__tests__/__snapshots__/withRNOrientationAppDelegate.spec.ts.snap +++ b/plugin/__tests__/__snapshots__/withRNOrientationAppDelegate.spec.ts.snap @@ -1,87 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`withRNOrientationAppDelegate updates the AppDelegate.mm with both header import and method implementation 1`] = ` -"#import "AppDelegate.h" - -#import -#import - -// React Native Orientation Director @generated begin @react-native-orientation-director/library-header-import - expo prebuild (DO NOT MODIFY) sync-af1be02bd9ab897604a4cdcc4ca982116e706e09 -#import "OrientationDirector.h" - -// React Native Orientation Director @generated end @react-native-orientation-director/library-header-import -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.moduleName = @"main"; - - // 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]; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ - return [self bundleURL]; -} - -- (NSURL *)bundleURL -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -// Linking API -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { - return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; -} - -// Universal Links -- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { - BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; - return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken -{ - return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error -{ - return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler -{ - return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; -} - -// React Native Orientation Director @generated begin @react-native-orientation-director/supportedInterfaceOrientationsFor-implementation - expo prebuild (DO NOT MODIFY) sync-db0218e305837273a44b9637a03e163243490ed6 -- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window -{ - return [OrientationDirector getSupportedInterfaceOrientationsForWindow]; -} - -// React Native Orientation Director @generated end @react-native-orientation-director/supportedInterfaceOrientationsFor-implementation -@end -" -`; - exports[`withRNOrientationAppDelegate updates the AppDelegate52.swift with the method implementation having public override when sdk is <= 52 1`] = ` "import UIKit import React import React_RCTAppDelegate import ReactAppDependencyProvider +// React Native Orientation Director @generated begin @react-native-orientation-director/library-import - expo prebuild (DO NOT MODIFY) sync-086b1a32084aa583b0c6bb0d2f672026498a6649 +import OrientationDirector +// React Native Orientation Director @generated end @react-native-orientation-director/library-import @main class AppDelegate: RCTAppDelegate { @@ -95,13 +21,13 @@ class AppDelegate: RCTAppDelegate { return super.application(application, didFinishLaunchingWithOptions: launchOptions) } -// React Native Orientation Director @generated begin @react-native-orientation-director/supportedInterfaceOrientationsFor-implementation - expo prebuild (DO NOT MODIFY) sync-147d50248b7b55d1acbe02fc03ff4cde90a30975 +// React Native Orientation Director @generated begin @react-native-orientation-director/supportedInterfaceOrientations-implementation - expo prebuild (DO NOT MODIFY) sync-68858d1d7ce6b3de98fb0b6949250dd1c78f36f4 public override func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { - return OrientationDirector.getSupportedInterfaceOrientationsForWindow() + return SharedOrientationDirectorImpl.shared.supportedInterfaceOrientations } -// React Native Orientation Director @generated end @react-native-orientation-director/supportedInterfaceOrientationsFor-implementation +// React Native Orientation Director @generated end @react-native-orientation-director/supportedInterfaceOrientations-implementation override func sourceURL(for bridge: RCTBridge) -> URL? { self.bundleURL() @@ -122,6 +48,9 @@ exports[`withRNOrientationAppDelegate updates the AppDelegate53.swift with the m "import Expo import React import ReactAppDependencyProvider +// React Native Orientation Director @generated begin @react-native-orientation-director/library-import - expo prebuild (DO NOT MODIFY) sync-086b1a32084aa583b0c6bb0d2f672026498a6649 +import OrientationDirector +// React Native Orientation Director @generated end @react-native-orientation-director/library-import @UIApplicationMain public class AppDelegate: ExpoAppDelegate { @@ -152,13 +81,13 @@ public class AppDelegate: ExpoAppDelegate { return super.application(application, didFinishLaunchingWithOptions: launchOptions) } -// React Native Orientation Director @generated begin @react-native-orientation-director/supportedInterfaceOrientationsFor-implementation - expo prebuild (DO NOT MODIFY) sync-147d50248b7b55d1acbe02fc03ff4cde90a30975 +// React Native Orientation Director @generated begin @react-native-orientation-director/supportedInterfaceOrientations-implementation - expo prebuild (DO NOT MODIFY) sync-68858d1d7ce6b3de98fb0b6949250dd1c78f36f4 public override func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { - return OrientationDirector.getSupportedInterfaceOrientationsForWindow() + return SharedOrientationDirectorImpl.shared.supportedInterfaceOrientations } -// React Native Orientation Director @generated end @react-native-orientation-director/supportedInterfaceOrientationsFor-implementation +// React Native Orientation Director @generated end @react-native-orientation-director/supportedInterfaceOrientations-implementation // Linking API public override func application( @@ -203,6 +132,9 @@ exports[`withRNOrientationAppDelegate updates the AppDelegate53.swift with the m "import Expo import React import ReactAppDependencyProvider +// React Native Orientation Director @generated begin @react-native-orientation-director/library-import - expo prebuild (DO NOT MODIFY) sync-086b1a32084aa583b0c6bb0d2f672026498a6649 +import OrientationDirector +// React Native Orientation Director @generated end @react-native-orientation-director/library-import @UIApplicationMain public class AppDelegate: ExpoAppDelegate { @@ -233,13 +165,13 @@ public class AppDelegate: ExpoAppDelegate { return super.application(application, didFinishLaunchingWithOptions: launchOptions) } -// React Native Orientation Director @generated begin @react-native-orientation-director/supportedInterfaceOrientationsFor-implementation - expo prebuild (DO NOT MODIFY) sync-e6869f486930a8ef16098c6ceec0011ee7ff621f +// React Native Orientation Director @generated begin @react-native-orientation-director/supportedInterfaceOrientations-implementation - expo prebuild (DO NOT MODIFY) sync-f1df6a547d90b271f0aab94a63c2049dcbc8dd07 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { - return OrientationDirector.getSupportedInterfaceOrientationsForWindow() + return SharedOrientationDirectorImpl.shared.supportedInterfaceOrientations } -// React Native Orientation Director @generated end @react-native-orientation-director/supportedInterfaceOrientationsFor-implementation +// React Native Orientation Director @generated end @react-native-orientation-director/supportedInterfaceOrientations-implementation // Linking API public override func application( diff --git a/plugin/__tests__/__snapshots__/withRNOrientationBridgingHeader.spec.ts.snap b/plugin/__tests__/__snapshots__/withRNOrientationBridgingHeader.spec.ts.snap deleted file mode 100644 index e154e5c..0000000 --- a/plugin/__tests__/__snapshots__/withRNOrientationBridgingHeader.spec.ts.snap +++ /dev/null @@ -1,9 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`withRNOrientationBridgingHeader updates the App Bridging-Header with the header import 1`] = ` -"// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - -#import "OrientationDirector.h"" -`; diff --git a/plugin/__tests__/fixtures/AppDelegate.mm b/plugin/__tests__/fixtures/AppDelegate.mm deleted file mode 100644 index b27f832..0000000 --- a/plugin/__tests__/fixtures/AppDelegate.mm +++ /dev/null @@ -1,62 +0,0 @@ -#import "AppDelegate.h" - -#import -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.moduleName = @"main"; - - // 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]; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ - return [self bundleURL]; -} - -- (NSURL *)bundleURL -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -// Linking API -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { - return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; -} - -// Universal Links -- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { - BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; - return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken -{ - return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error -{ - return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler -{ - return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; -} - -@end diff --git a/plugin/__tests__/fixtures/Bridging-Header.h b/plugin/__tests__/fixtures/Bridging-Header.h deleted file mode 100644 index e11d920..0000000 --- a/plugin/__tests__/fixtures/Bridging-Header.h +++ /dev/null @@ -1,3 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// diff --git a/plugin/__tests__/withRNOrientationAppDelegate.spec.ts b/plugin/__tests__/withRNOrientationAppDelegate.spec.ts index 4e6a657..c22d04a 100644 --- a/plugin/__tests__/withRNOrientationAppDelegate.spec.ts +++ b/plugin/__tests__/withRNOrientationAppDelegate.spec.ts @@ -2,7 +2,6 @@ import * as fs from 'node:fs'; import * as path from 'node:path'; import { - objCFileUpdater, swiftFileUpdater, } from '../src/withRNOrientationAppDelegate'; @@ -11,14 +10,6 @@ describe('withRNOrientationAppDelegate', function () { jest.resetAllMocks(); }); - it('updates the AppDelegate.mm with both header import and method implementation', async function () { - const appDelegatePath = path.join(__dirname, './fixtures/AppDelegate.mm'); - const appDelegate = await fs.promises.readFile(appDelegatePath, 'utf-8'); - - const result = objCFileUpdater(appDelegate); - expect(result).toMatchSnapshot(); - }); - it('updates the AppDelegate52.swift with the method implementation having public override when sdk is <= 52', async function () { const appDelegatePath = path.join( __dirname, diff --git a/plugin/__tests__/withRNOrientationBridgingHeader.spec.ts b/plugin/__tests__/withRNOrientationBridgingHeader.spec.ts deleted file mode 100644 index 7b75fe8..0000000 --- a/plugin/__tests__/withRNOrientationBridgingHeader.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import * as fs from 'node:fs'; -import * as path from 'node:path'; - -import { bridgingHeaderUpdater } from '../src/withRNOrientationBridgingHeader'; - -describe('withRNOrientationBridgingHeader', function () { - beforeEach(function () { - jest.resetAllMocks(); - }); - - it('updates the App Bridging-Header with the header import', async function () { - const bridgingHeaderPath = path.join( - __dirname, - './fixtures/Bridging-Header.h' - ); - const bridgingHeader = await fs.promises.readFile( - bridgingHeaderPath, - 'utf-8' - ); - - const result = bridgingHeaderUpdater(bridgingHeader); - expect(result).toMatchSnapshot(); - }); -}); diff --git a/plugin/src/custom-mod/withBridgingHeader.ts b/plugin/src/custom-mod/withBridgingHeader.ts deleted file mode 100644 index 284951b..0000000 --- a/plugin/src/custom-mod/withBridgingHeader.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - type ConfigPlugin, - IOSConfig, - type Mod, - withMod, - BaseMods, - type ExportedConfig, -} from '@expo/config-plugins'; -import { globSync } from 'glob'; -import * as fs from 'node:fs'; - -/** - * Reference: https://github.com/expo/expo/blob/cb38337d37c35a26ac9a39eac2268c4735f488ad/packages/%40expo/config-plugins/src/ios/Paths.ts#L10C1-L10C69 - */ -const ignoredPaths = ['**/@(Carthage|Pods|vendor|node_modules)/**']; - -/** - * This plugin adds a new mod to the prebuild that is the appBridgingHeader. - * This allows us to update it when the user launches the prebuild script. - */ -export function withAppBridgingHeaderMod(config: ExportedConfig) { - return BaseMods.withGeneratedBaseMods<'appBridgingHeader'>(config, { - platform: 'ios', - providers: { - // Append a custom rule to supply AppDelegate header data to mods on `mods.ios.appBridgingHeader` - appBridgingHeader: - BaseMods.provider({ - // Get the local filepath that should be passed to the `read` method. - getFilePath({ modRequest: { projectRoot } }) { - return getBridgingHeaderFilePath(projectRoot); - }, - // Read the input file from the filesystem. - async read(filePath) { - return IOSConfig.Paths.getFileInfo(filePath); - }, - // Write the resulting output to the filesystem. - async write(filePath: string, { modResults: { contents } }) { - await fs.promises.writeFile(filePath, contents); - }, - }), - }, - }); -} - -/** - * This mod provides the app bridging header for modifications - * @param config - * @param action - */ -export const withAppBridgingHeader: ConfigPlugin< - Mod -> = (config, action) => { - return withMod(config, { - platform: 'ios', - mod: 'appBridgingHeader', - action, - }); -}; - -/** - * Reference: https://github.com/expo/expo/blob/cb38337d37c35a26ac9a39eac2268c4735f488ad/packages/%40expo/config-plugins/src/ios/Paths.ts#L23 - * @param projectRoot - */ -function getBridgingHeaderFilePath(projectRoot: string) { - const [using, ...extra] = withSortedGlobResult( - globSync('ios/*/*-Bridging-Header.h', { - absolute: true, - cwd: projectRoot, - ignore: ignoredPaths, - }) - ); - - if (!using) { - throw new Error( - `Could not locate a valid Bridging-Header at root: "${projectRoot}"` - ); - } - - if (extra.length) { - throw new Error(`Multiple Bridging-Header found at root: "${projectRoot}"`); - } - - return using; -} - -/** - * Reference: https://github.com/expo/expo/blob/main/packages/%40expo/config-plugins/src/utils/glob.ts - */ -function withSortedGlobResult(glob: string[]) { - return glob.sort((a, b) => a.localeCompare(b)); -} diff --git a/plugin/src/index.ts b/plugin/src/index.ts index dc179ef..560b83a 100644 --- a/plugin/src/index.ts +++ b/plugin/src/index.ts @@ -4,9 +4,7 @@ import { withPlugins, } from '@expo/config-plugins'; -import { withAppBridgingHeaderMod } from './custom-mod/withBridgingHeader'; import { withRNOrientationAppDelegate } from './withRNOrientationAppDelegate'; -import { withRNOrientationBridgingHeader } from './withRNOrientationBridgingHeader'; import { withRNOrientationMainActivity } from './withRNOrientationMainActivity'; /** @@ -22,9 +20,7 @@ import { withRNOrientationMainActivity } from './withRNOrientationMainActivity'; const withRNOrientationDirector: ConfigPlugin = (config) => { return withPlugins(config, [ withRNOrientationAppDelegate, - withRNOrientationBridgingHeader, withRNOrientationMainActivity, - withAppBridgingHeaderMod, ]); }; diff --git a/plugin/src/withRNOrientationAppDelegate.ts b/plugin/src/withRNOrientationAppDelegate.ts index d1207ee..feb1a30 100644 --- a/plugin/src/withRNOrientationAppDelegate.ts +++ b/plugin/src/withRNOrientationAppDelegate.ts @@ -15,44 +15,18 @@ async function readAppDelegateFileAndUpdateContents( ): Promise> { const { modResults: appDelegateFile } = config; - const fileUpdater = getCompatibleFileUpdater(appDelegateFile.language); - if (fileUpdater.language === 'swift') { - const { worker } = fileUpdater; - appDelegateFile.contents = worker( - appDelegateFile.contents, - config.sdkVersion + if (appDelegateFile.language !== 'swift') { + throw new Error( + `Cannot add React Native Orientation Director code to AppDelegate of language "${appDelegateFile.language}"` ); - } else { - const { worker } = fileUpdater; - appDelegateFile.contents = worker(appDelegateFile.contents); } - return config; -} + appDelegateFile.contents = swiftFileUpdater( + appDelegateFile.contents, + config.sdkVersion + ); -function getCompatibleFileUpdater( - language: AppDelegateProjectFile['language'] -): - | { language: 'swift'; worker: typeof swiftFileUpdater } - | { language: 'objc' | 'objcpp'; worker: typeof objCFileUpdater } { - switch (language) { - case 'objc': - case 'objcpp': { - return { - language, - worker: objCFileUpdater, - }; - } - case 'swift': - return { - language, - worker: swiftFileUpdater, - }; - default: - throw new Error( - `Cannot add React Native Orientation Director code to AppDelegate of language "${language}"` - ); - } + return config; } export function swiftFileUpdater( @@ -60,23 +34,34 @@ export function swiftFileUpdater( sdkVersion?: string ): string { const methodPrefix = computeMethodPrefix(sdkVersion); - const supportedInterfaceOrientationsForCodeBlock = `\n ${methodPrefix} func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { - return OrientationDirector.getSupportedInterfaceOrientationsForWindow() + + const libraryImportCodeBlock = `import OrientationDirector`; + const rightBeforeAnnotation = /@main|@UIApplicationMain/g; + const withImport = mergeContents({ + tag: '@react-native-orientation-director/library-import', + src: originalContents, + newSrc: libraryImportCodeBlock, + anchor: rightBeforeAnnotation, + offset: -1, + comment: '// React Native Orientation Director', + }); + + const supportedInterfaceOrientationsCodeBlock = `\n ${methodPrefix} func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { + return SharedOrientationDirectorImpl.shared.supportedInterfaceOrientations }\n`; const rightBeforeLastClosingBrace = /didFinishLaunchingWithOptions:\s*launchOptions\)/g; const pasteInTheListJustAfterTheClosingBracket = 2; - - const results = mergeContents({ - tag: '@react-native-orientation-director/supportedInterfaceOrientationsFor-implementation', - src: originalContents, - newSrc: supportedInterfaceOrientationsForCodeBlock, + const completedMerge = mergeContents({ + tag: '@react-native-orientation-director/supportedInterfaceOrientations-implementation', + src: withImport.contents, + newSrc: supportedInterfaceOrientationsCodeBlock, anchor: rightBeforeLastClosingBrace, offset: pasteInTheListJustAfterTheClosingBracket, comment: '// React Native Orientation Director', }); - return results.contents; + return completedMerge.contents; function computeMethodPrefix(_sdkVersion?: string) { if (!_sdkVersion) { @@ -100,34 +85,3 @@ export function swiftFileUpdater( return 'public override'; } } - -export function objCFileUpdater(originalContents: string): string { - const libraryHeaderImportCodeBlock = '#import "OrientationDirector.h"\n'; - const rightBeforeAppDelegateImplementation = /@implementation\s+\w+/g; - - const headerImportMergeResults = mergeContents({ - tag: '@react-native-orientation-director/library-header-import', - src: originalContents, - newSrc: libraryHeaderImportCodeBlock, - anchor: rightBeforeAppDelegateImplementation, - offset: 0, - comment: '// React Native Orientation Director', - }); - - const supportedInterfaceOrientationsForCodeBlock = `- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window -{ - return [OrientationDirector getSupportedInterfaceOrientationsForWindow]; -}\n`; - const rightBeforeLastClosingEnd = /@end[^@]*$/g; - - const implementationMergeResults = mergeContents({ - tag: '@react-native-orientation-director/supportedInterfaceOrientationsFor-implementation', - src: headerImportMergeResults.contents, - newSrc: supportedInterfaceOrientationsForCodeBlock, - anchor: rightBeforeLastClosingEnd, - offset: 0, - comment: '// React Native Orientation Director', - }); - - return implementationMergeResults.contents; -} diff --git a/plugin/src/withRNOrientationBridgingHeader.ts b/plugin/src/withRNOrientationBridgingHeader.ts deleted file mode 100644 index e45194a..0000000 --- a/plugin/src/withRNOrientationBridgingHeader.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - type ConfigPlugin, - type ExportedConfigWithProps, - IOSConfig, -} from '@expo/config-plugins'; -import { type AppDelegateProjectFile } from '@expo/config-plugins/build/ios/Paths'; - -import { withAppBridgingHeader } from './custom-mod/withBridgingHeader'; - -export const withRNOrientationBridgingHeader: ConfigPlugin = (config) => { - return withAppBridgingHeader(config, readBridgingHeaderFileAndUpdateContents); -}; - -async function readBridgingHeaderFileAndUpdateContents( - config: ExportedConfigWithProps -) { - const { projectRoot } = config.modRequest; - if (isObjCTemplate(projectRoot)) { - return config; - } - - const { modResults: bridgingHeaderFile } = config; - - bridgingHeaderFile.contents = bridgingHeaderUpdater( - bridgingHeaderFile.contents - ); - - return config; -} - -export function bridgingHeaderUpdater(originalContents: string) { - const libraryHeaderImport = '#import "OrientationDirector.h"'; - - return originalContents.concat(`\n${libraryHeaderImport}`); -} - -function isObjCTemplate(projectRoot: string) { - const appDelegateFile = IOSConfig.Paths.getAppDelegate(projectRoot); - return appDelegateFile.language !== 'swift'; -} From 6166d182d53bf23c90249a9740340cd0d5bdc79e Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sat, 14 Mar 2026 22:59:46 +0100 Subject: [PATCH 07/18] feat(iOS): enable new architecture in example Podfile --- example/ios/Podfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/example/ios/Podfile b/example/ios/Podfile index 3b3eeac..a8a1a18 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,3 +1,5 @@ +ENV['RCT_NEW_ARCH_ENABLED'] = '1' + # Resolve react_native_pods.rb with node to allow for hoisting require Pod::Executable.execute_command('node', ['-p', 'require.resolve( From 144506573f33017a618eceda39e43e4dd316b4fc Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sat, 14 Mar 2026 23:18:45 +0100 Subject: [PATCH 08/18] feat(iOS): implement proper event emitter pattern --- example/ios/Podfile.lock | 2 +- ios/OrientationDirector.h | 9 +--- ios/OrientationDirector.mm | 12 +++-- ios/implementation/EventManager.swift | 35 +++++---------- .../OrientationDirectorImpl.swift | 8 ++-- src/EventEmitter.ts | 45 +++++++++---------- src/NativeOrientationDirector.ts | 11 +++-- 7 files changed, 55 insertions(+), 67 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index f6316ed..c03051f 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2237,6 +2237,6 @@ SPEC CHECKSUMS: RNScreens: 6cb648bdad8fe9bee9259fe144df95b6d1d5b707 Yoga: c0b3f2c7e8d3e327e450223a2414ca3fa296b9a2 -PODFILE CHECKSUM: bfadd5c448c675487716675a72372c0a6789fc8b +PODFILE CHECKSUM: bedb5e847ffc384fd4a139bfd44003673c5a1dc2 COCOAPODS: 1.16.2 diff --git a/ios/OrientationDirector.h b/ios/OrientationDirector.h index 96c8e51..aeed0ca 100644 --- a/ios/OrientationDirector.h +++ b/ios/OrientationDirector.h @@ -1,12 +1,5 @@ -#import #import -NS_ASSUME_NONNULL_BEGIN - -@interface OrientationDirector : RCTEventEmitter - -@property (nonatomic, assign) BOOL isJsListening; +@interface OrientationDirector : NativeOrientationDirectorSpecBase @end - -NS_ASSUME_NONNULL_END diff --git a/ios/OrientationDirector.mm b/ios/OrientationDirector.mm index 60a89b3..728c7bf 100644 --- a/ios/OrientationDirector.mm +++ b/ios/OrientationDirector.mm @@ -51,12 +51,16 @@ -(void)stopObserving { self.isJsListening = NO; } -- (NSArray *)supportedEvents { - return [EventManager supportedEvents]; +-(void)emitOnDeviceOrientationDidChangeWithParams:(NSDictionary*)params { + [self emitOnDeviceOrientationChanged:params]; } -- (void)sendEventWithName:(NSString * _Nonnull)name params:(NSDictionary *)params { - [self sendEventWithName:name body:params]; +-(void)emitOnInterfaceOrientationDidChangeWithParams:(NSDictionary*)params { + [self emitOnInterfaceOrientationChanged:params]; +} + +-(void)emitOnLockChangedWithParams:(NSDictionary*)params { + [self emitOnLockChanged:params]; } /// /////////////////////////////////////////////////////////////////////////////////////// diff --git a/ios/implementation/EventManager.swift b/ios/implementation/EventManager.swift index e24baa9..ed00ec2 100644 --- a/ios/implementation/EventManager.swift +++ b/ios/implementation/EventManager.swift @@ -7,10 +7,10 @@ import Foundation -@objc public class EventManager: NSObject { - @objc public weak var delegate: OrientationEventEmitterDelegate? +public class EventManager: NSObject { + public weak var delegate: OrientationEventEmitterDelegate? - func sendDeviceOrientationDidChange(orientationValue: Int) { + func sendDeviceOrientationDidChange(value: Int) { guard let delegate = delegate else { return } @@ -19,11 +19,11 @@ import Foundation return } - let params = Dictionary(dictionaryLiteral: ("orientation", orientationValue)) - delegate.sendEvent(name: Event.DeviceOrientationDidChange.rawValue, params: params as NSDictionary) + let params = Dictionary(dictionaryLiteral: ("orientation", value)) + delegate.emitOnDeviceOrientationDidChange(params: params as NSDictionary) } - func sendInterfaceOrientationDidChange(orientationValue: Int) { + func sendInterfaceOrientationDidChange(value: Int) { guard let delegate = delegate else { return } @@ -32,8 +32,8 @@ import Foundation return } - let params = Dictionary(dictionaryLiteral: ("orientation", orientationValue)) - delegate.sendEvent(name: Event.InterfaceOrientationDidChange.rawValue, params: params as NSDictionary) + let params = Dictionary(dictionaryLiteral: ("orientation", value)) + delegate.emitOnInterfaceOrientationDidChange(params: params as NSDictionary) } func sendLockDidChange(value: Bool) { @@ -46,25 +46,14 @@ import Foundation } let params = Dictionary(dictionaryLiteral: ("locked", value)) - delegate.sendEvent(name: Event.LockDidChange.rawValue, params: params as NSDictionary) + delegate.emitOnLockChanged(params: params as NSDictionary) } } @objc public protocol OrientationEventEmitterDelegate { var isJsListening: Bool { get set } - func sendEvent(name: String, params: NSDictionary) -} - -public extension EventManager { - - enum Event: String, CaseIterable { - case DeviceOrientationDidChange - case InterfaceOrientationDidChange - case LockDidChange - } - - @objc static var supportedEvents: [String] { - return Event.allCases.map(\.rawValue) - } + func emitOnLockChanged(params: NSDictionary) + func emitOnDeviceOrientationDidChange(params: NSDictionary) + func emitOnInterfaceOrientationDidChange(params: NSDictionary) } diff --git a/ios/implementation/OrientationDirectorImpl.swift b/ios/implementation/OrientationDirectorImpl.swift index 8048cf6..57665b2 100644 --- a/ios/implementation/OrientationDirectorImpl.swift +++ b/ios/implementation/OrientationDirectorImpl.swift @@ -8,7 +8,7 @@ import Foundation import UIKit -@objc public class OrientationDirectorImpl: NSObject { +@objcMembers public class OrientationDirectorImpl: NSObject { private static let TAG = "OrientationDirectorImpl" private let bundleManager: BundleManager = BundleManager() @@ -19,7 +19,7 @@ import UIKit private var lastInterfaceOrientation = Orientation.UNKNOWN private var lastDeviceOrientation = Orientation.UNKNOWN private var isLocked = false - + /// # Only on iOS < 16 /// This variable is needed to prevent a loop where /// we lock the interface to a specific orientation @@ -174,11 +174,11 @@ import UIKit private func onOrientationChanged(uiDeviceOrientation: UIDeviceOrientation) { let deviceOrientation = utils.convertToOrientationFrom(deviceOrientation: uiDeviceOrientation) - + if (!self.isLocking) { self.eventManager.sendDeviceOrientationDidChange(orientationValue: deviceOrientation.rawValue) } - + lastDeviceOrientation = deviceOrientation adaptInterfaceTo(deviceOrientation: deviceOrientation) } diff --git a/src/EventEmitter.ts b/src/EventEmitter.ts index c625b35..f20e05e 100644 --- a/src/EventEmitter.ts +++ b/src/EventEmitter.ts @@ -1,27 +1,22 @@ -import { Platform, type EmitterSubscription } from 'react-native'; -import Module, { ModuleEventEmitter } from './module'; -import Event from './types/Event.enum'; +import { Platform, type EventSubscription } from 'react-native'; +import Module from './module'; import type { OrientationEvent } from './types/OrientationEvent.interface'; import type { LockedEvent } from './types/LockedEvent.interface'; class EventEmitter { + private static androidListenerCount = 0; + static addDeviceOrientationDidChangeListener( callback: (orientation: OrientationEvent) => void ) { - let listener = ModuleEventEmitter.addListener( - Event.DeviceOrientationDidChange, - callback - ); + let listener = Module.onDeviceOrientationChanged(callback); if (Platform.OS !== 'android') { return listener; } - const listenerCount = ModuleEventEmitter.listenerCount( - Event.DeviceOrientationDidChange - ); - - if (listenerCount === 1) { + EventEmitter.androidListenerCount++; + if (EventEmitter.androidListenerCount === 1) { Module.enableOrientationSensors(); } @@ -31,20 +26,17 @@ class EventEmitter { static addInterfaceOrientationDidChangeListener( callback: (orientation: OrientationEvent) => void ) { - return ModuleEventEmitter.addListener( - Event.InterfaceOrientationDidChange, - callback - ); + return Module.onInterfaceOrientationChanged(callback); } static addLockDidChangeListener(callback: (event: LockedEvent) => void) { - return ModuleEventEmitter.addListener(Event.LockDidChange, callback); + return Module.onLockChanged(callback); } private static createDeviceOrientationListenerProxy( - listener: EmitterSubscription + listener: EventSubscription ) { - const handler: ProxyHandler = { + const handler: ProxyHandler = { get(target, propertyKey, receiver) { if (propertyKey === 'remove') { disableOrientationSensorsIfLastListener(); @@ -56,13 +48,18 @@ class EventEmitter { return new Proxy(listener, handler); function disableOrientationSensorsIfLastListener() { - const listenerCount = ModuleEventEmitter.listenerCount( - Event.DeviceOrientationDidChange - ); - - if (listenerCount === 1) { + if (EventEmitter.androidListenerCount === 1) { + EventEmitter.androidListenerCount = 0; Module.disableOrientationSensors(); + return; } + + if (EventEmitter.androidListenerCount === 0) { + return; + } + + EventEmitter.androidListenerCount--; + return; } } } diff --git a/src/NativeOrientationDirector.ts b/src/NativeOrientationDirector.ts index 0418fc1..eb87b8a 100644 --- a/src/NativeOrientationDirector.ts +++ b/src/NativeOrientationDirector.ts @@ -1,4 +1,4 @@ -import type { TurboModule } from 'react-native'; +import { type CodegenTypes, type TurboModule } from 'react-native'; import { TurboModuleRegistry } from 'react-native'; export interface Spec extends TurboModule { @@ -21,8 +21,13 @@ export interface Spec extends TurboModule { // //////////////////////////////////// - addListener: (eventType: string) => void; - removeListeners: (count: number) => void; + readonly onDeviceOrientationChanged: CodegenTypes.EventEmitter<{ + orientation: number; + }>; + readonly onInterfaceOrientationChanged: CodegenTypes.EventEmitter<{ + orientation: number; + }>; + readonly onLockChanged: CodegenTypes.EventEmitter<{ locked: boolean }>; } export default TurboModuleRegistry.getEnforcing('OrientationDirector'); From 5bd333c42ac5ec65fe66493afe501ccbc83e7ae0 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sun, 15 Mar 2026 12:35:55 +0100 Subject: [PATCH 09/18] feat(android): implement proper event emitter pattern --- .../OrientationDirectorModule.kt | 18 ++++++++++++---- .../implementation/EventManager.kt | 21 ++++--------------- .../implementation/EventManagerDelegate.kt | 9 ++++++++ .../OrientationDirectorModuleImpl.kt | 4 ++-- 4 files changed, 29 insertions(+), 23 deletions(-) create mode 100644 android/src/main/java/com/orientationdirector/implementation/EventManagerDelegate.kt diff --git a/android/src/main/java/com/orientationdirector/OrientationDirectorModule.kt b/android/src/main/java/com/orientationdirector/OrientationDirectorModule.kt index 25dcb15..ee51170 100644 --- a/android/src/main/java/com/orientationdirector/OrientationDirectorModule.kt +++ b/android/src/main/java/com/orientationdirector/OrientationDirectorModule.kt @@ -2,14 +2,16 @@ package com.orientationdirector import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.WritableMap +import com.orientationdirector.implementation.EventManagerDelegate import com.orientationdirector.implementation.OrientationDirectorModuleImpl class OrientationDirectorModule(reactContext: ReactApplicationContext) : - NativeOrientationDirectorSpec(reactContext) { + NativeOrientationDirectorSpec(reactContext), EventManagerDelegate { override fun getName() = NAME - private var implementation = OrientationDirectorModuleImpl(reactContext) + private var implementation = OrientationDirectorModuleImpl(reactContext, this) override fun getInterfaceOrientation(promise: Promise) { promise.resolve(implementation.getInterfaceOrientation().ordinal) @@ -47,9 +49,17 @@ class OrientationDirectorModule(reactContext: ReactApplicationContext) : return implementation.disableOrientationSensors() } - override fun addListener(eventName: String) {} + override fun sendOnDeviceOrientationChanged(params: WritableMap) { + emitOnDeviceOrientationChanged(params) + } + + override fun sendOnInterfaceOrientationChanged(params: WritableMap) { + emitOnInterfaceOrientationChanged(params) + } - override fun removeListeners(count: Double) {} + override fun sendOnLockChanged(params: WritableMap) { + emitOnLockChanged(params) + } companion object { const val NAME = OrientationDirectorModuleImpl.NAME diff --git a/android/src/main/java/com/orientationdirector/implementation/EventManager.kt b/android/src/main/java/com/orientationdirector/implementation/EventManager.kt index ed37ae6..d126d14 100644 --- a/android/src/main/java/com/orientationdirector/implementation/EventManager.kt +++ b/android/src/main/java/com/orientationdirector/implementation/EventManager.kt @@ -5,39 +5,26 @@ import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.WritableMap import com.facebook.react.modules.core.DeviceEventManagerModule -enum class Event { - DeviceOrientationDidChange, - InterfaceOrientationDidChange, - LockDidChange, -} - -class EventManager(private val context: ReactApplicationContext) { - +class EventManager(private val delegate: EventManagerDelegate) { fun sendDeviceOrientationDidChange(orientationValue: Int) { val params = Arguments.createMap().apply { putInt("orientation", orientationValue) } - sendEvent(Event.DeviceOrientationDidChange, params) + delegate.sendOnDeviceOrientationChanged(params) } fun sendInterfaceOrientationDidChange(orientationValue: Int) { val params = Arguments.createMap().apply { putInt("orientation", orientationValue) } - sendEvent(Event.InterfaceOrientationDidChange, params) + delegate.sendOnInterfaceOrientationChanged(params) } fun sendLockDidChange(value: Boolean) { val params = Arguments.createMap().apply { putBoolean("locked", value) } - sendEvent(Event.LockDidChange, params) - } - - private fun sendEvent(eventName: Event, params: WritableMap?) { - context - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) - .emit(eventName.name, params) + delegate.sendOnLockChanged(params) } companion object { diff --git a/android/src/main/java/com/orientationdirector/implementation/EventManagerDelegate.kt b/android/src/main/java/com/orientationdirector/implementation/EventManagerDelegate.kt new file mode 100644 index 0000000..1f11c17 --- /dev/null +++ b/android/src/main/java/com/orientationdirector/implementation/EventManagerDelegate.kt @@ -0,0 +1,9 @@ + package com.orientationdirector.implementation + + import com.facebook.react.bridge.WritableMap + + interface EventManagerDelegate { + fun sendOnDeviceOrientationChanged(params: WritableMap) + fun sendOnInterfaceOrientationChanged(params: WritableMap) + fun sendOnLockChanged(params: WritableMap) + } diff --git a/android/src/main/java/com/orientationdirector/implementation/OrientationDirectorModuleImpl.kt b/android/src/main/java/com/orientationdirector/implementation/OrientationDirectorModuleImpl.kt index 113d2cf..cdf36bf 100644 --- a/android/src/main/java/com/orientationdirector/implementation/OrientationDirectorModuleImpl.kt +++ b/android/src/main/java/com/orientationdirector/implementation/OrientationDirectorModuleImpl.kt @@ -5,9 +5,9 @@ import android.os.Handler import android.os.Looper import com.facebook.react.bridge.ReactApplicationContext -class OrientationDirectorModuleImpl internal constructor(private val context: ReactApplicationContext) { +class OrientationDirectorModuleImpl internal constructor(private val context: ReactApplicationContext, eventManagerDelegate: EventManagerDelegate) { private var mUtils = Utils(context) - private var mEventManager = EventManager(context) + private var mEventManager = EventManager(eventManagerDelegate) private var mOrientationSensorsEventListener = OrientationSensorsEventListener(context) private var mAutoRotationObserver = AutoRotationObserver( context, Handler( From e5bed504c569ea7aa992364cc649f1af070036e8 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sun, 15 Mar 2026 13:03:50 +0100 Subject: [PATCH 10/18] chore(android): delete tests since mocking for new arch is too expensive --- .github/workflows/pr.yml | 5 - .github/workflows/release.yml | 5 - android/build.gradle | 5 - android/gradle.properties | 12 - .../OrientationDirectorModuleImplTest.kt | 199 ----------- .../implementation/UtilsTest.kt | 314 ------------------ 6 files changed, 540 deletions(-) delete mode 100644 android/gradle.properties delete mode 100644 android/src/test/java/com/orientationdirector/implementation/OrientationDirectorModuleImplTest.kt delete mode 100644 android/src/test/java/com/orientationdirector/implementation/UtilsTest.kt diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 03ddfff..c052812 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -100,11 +100,6 @@ jobs: restore-keys: | ${{ runner.os }}-gradle- - - name: Run test - if: env.turbo_cache_hit != 1 - run: | - cd example/android && ./gradlew react-native-orientation-director:testDebugUnitTest - - name: Build example for Android env: JAVA_OPTS: "-XX:MaxHeapSize=6g" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d3f2207..e54ddee 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -134,11 +134,6 @@ jobs: restore-keys: | ${{ runner.os }}-gradle- - - name: Run test - if: env.turbo_cache_hit != 1 - run: | - cd example/android && ./gradlew react-native-orientation-director:testDebugUnitTest - - name: Build example for Android env: JAVA_OPTS: "-XX:MaxHeapSize=6g" diff --git a/android/build.gradle b/android/build.gradle index 73cd89a..652edc0 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -64,9 +64,4 @@ android { dependencies { implementation "com.facebook.react:react-android" - - testImplementation "junit:junit:$junit_version" - testImplementation "androidx.test:core:$android_x_core_version" - testImplementation "org.robolectric:robolectric:$robolectric_version" - testImplementation "org.mockito:mockito-core:$mockito_core_version" } diff --git a/android/gradle.properties b/android/gradle.properties deleted file mode 100644 index 76859fb..0000000 --- a/android/gradle.properties +++ /dev/null @@ -1,12 +0,0 @@ -######################### -# TESTING -# - -junit_version=4.13.2 -android_x_core_version=1.5.+ -robolectric_version=4.13 -mockito_core_version=5.14.2 - -# -######################### - diff --git a/android/src/test/java/com/orientationdirector/implementation/OrientationDirectorModuleImplTest.kt b/android/src/test/java/com/orientationdirector/implementation/OrientationDirectorModuleImplTest.kt deleted file mode 100644 index 8cfea02..0000000 --- a/android/src/test/java/com/orientationdirector/implementation/OrientationDirectorModuleImplTest.kt +++ /dev/null @@ -1,199 +0,0 @@ -package com.orientationdirector.implementation - -import android.os.Looper -import androidx.test.core.app.ApplicationProvider -import com.facebook.react.bridge.BridgeReactContext -import org.junit.Assert.* -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.InjectMocks -import org.mockito.Mock -import org.mockito.Mockito.`when` -import org.mockito.MockitoAnnotations -import org.robolectric.RobolectricTestRunner -import org.robolectric.annotation.Config - -@RunWith(RobolectricTestRunner::class) -class OrientationDirectorModuleImplTest { - private var context = BridgeReactContext(ApplicationProvider.getApplicationContext()) - - @Mock - private val mockEventManager = EventManager(context) - - @Mock - private val mockAutoRotationObserver = AutoRotationObserver( - context, - android.os.Handler(Looper.getMainLooper()) - ) - - @InjectMocks - private val mModule = OrientationDirectorModuleImpl(context) - - @Before - fun setup() { - MockitoAnnotations.openMocks(this) - - // We stub this method because adaptInterfaceTo checks it - `when`(mockAutoRotationObserver.getLastAutoRotationStatus()).thenReturn(true) - } - - @Test - @Config( - qualifiers = "port" - ) - fun assert_initial_orientation_matches_portrait() { - val orientation = mModule.getInterfaceOrientation() - - assertEquals( - "When user starts the app with the device in portrait, the initial interface should be portrait", - Orientation.PORTRAIT, - orientation - ) - } - - @Test - @Config( - qualifiers = "land" - ) - fun assert_initial_orientation_matches_landscape_left() { - val orientation = mModule.getInterfaceOrientation() - - assertEquals( - "When user starts the app with the device in landscape, the initial interface should be landscape left", - Orientation.LANDSCAPE_LEFT, - orientation - ) - } - - @Test - fun assert_initial_device_orientation_matches_unknown_at_startup() { - val orientation = mModule.getDeviceOrientation() - - assertEquals( - "When user starts the app, the initial device orientation should be unknown", - Orientation.UNKNOWN, - orientation - ) - } - - @Test - fun assert_initial_is_locked_matches_false_at_startup() { - val isLocked = mModule.getIsLocked() - - assertEquals( - "When user starts the app, interface orientation shouldn't be locked", - false, - isLocked - ) - } - - @Test - fun assert_is_locked_matches_true_after_lock_to_gets_executed() { - mModule.lockTo(1) - val isLocked = mModule.getIsLocked() - - assertEquals( - "When lockTo is executed, getIsLocked should match true", - true, - isLocked - ) - } - - @Test - fun assert_interface_orientation_matches_locked_to_portrait() { - mModule.lockTo(1) - - assertEquals( - "When the interface is locked to portrait, getInterfaceOrientation should return portrait", - Orientation.PORTRAIT, - mModule.getInterfaceOrientation() - ) - } - - @Test - fun assert_interface_orientation_matches_locked_to_landscape_right() { - mModule.lockTo(2) - - assertEquals( - "When the interface is locked to landscape right, getInterfaceOrientation should return landscape right", - Orientation.LANDSCAPE_RIGHT, - mModule.getInterfaceOrientation() - ) - } - - @Test - fun assert_interface_orientation_matches_locked_to_portrait_upside_down() { - mModule.lockTo(3) - - assertEquals( - "When the interface is locked to portrait upside down, getInterfaceOrientation should return portrait upside down", - Orientation.PORTRAIT_UPSIDE_DOWN, - mModule.getInterfaceOrientation() - ) - } - - @Test - fun assert_interface_orientation_matches_locked_to_landscape_left() { - mModule.lockTo(4) - - assertEquals( - "When the interface is locked to landscape left, getInterfaceOrientation should return landscape left", - Orientation.LANDSCAPE_LEFT, - mModule.getInterfaceOrientation() - ) - } - - @Test - fun assert_interface_orientation_matches_locked_to_landscape() { - mModule.lockTo(5) - - assertEquals( - "When the interface is locked to landscape, getInterfaceOrientation should return landscape right", - Orientation.LANDSCAPE_RIGHT, - mModule.getInterfaceOrientation() - ) - } - - @Test - fun assert_is_locked_reset_when_unlock_is_executed() { - mModule.lockTo(1) - mModule.unlock() - - assertEquals( - "When unlock is executed, getIsLocked should return false", - false, - mModule.getIsLocked() - ) - } - - @Test - @Config( - qualifiers = "port" - ) - fun assert_interface_reset_to_portrait_on_unlock() { - mModule.lockTo(2) - mModule.unlock() - - assertEquals( - "When unlock is executed, getInterfaceOrientation should match portrait when device is in portrait", - Orientation.PORTRAIT, - mModule.getInterfaceOrientation() - ) - } - - @Test - @Config( - qualifiers = "land" - ) - fun assert_interface_reset_to_landscape_left_on_unlock() { - mModule.lockTo(2) - mModule.unlock() - - assertEquals( - "When unlock is executed, getInterfaceOrientation should match landscape left when device is in landscape right", - Orientation.LANDSCAPE_LEFT, - mModule.getInterfaceOrientation() - ) - } -} diff --git a/android/src/test/java/com/orientationdirector/implementation/UtilsTest.kt b/android/src/test/java/com/orientationdirector/implementation/UtilsTest.kt deleted file mode 100644 index d4e8ae0..0000000 --- a/android/src/test/java/com/orientationdirector/implementation/UtilsTest.kt +++ /dev/null @@ -1,314 +0,0 @@ -package com.orientationdirector.implementation - -import android.content.pm.ActivityInfo -import android.os.Build -import android.view.Surface -import androidx.test.core.app.ApplicationProvider -import com.facebook.react.bridge.BridgeReactContext -import org.junit.Assert.* -import org.junit.Test -import org.junit.runner.RunWith -import org.robolectric.RobolectricTestRunner -import org.robolectric.annotation.Config - -@RunWith(RobolectricTestRunner::class) -class UtilsTest { - private var context = BridgeReactContext(ApplicationProvider.getApplicationContext()) - private var mUtils = Utils(context) - - @Config( - sdk = [Build.VERSION_CODES.N], - qualifiers = "land" - ) - @Test - fun assert_interface_rotation_matches_current_landscape() { - val rotation = mUtils.getInterfaceRotation() - - assertEquals( - "When current interface orientation is landscape, rotation should be 1", - Surface.ROTATION_90, - rotation - ) - } - - @Config( - sdk = [Build.VERSION_CODES.R], - qualifiers = "port" - ) - @Test - fun assert_interface_rotation_matches_current_portrait() { - val rotation = mUtils.getInterfaceRotation() - - assertEquals( - "When current interface orientation is portrait, rotation should be 0", - Surface.ROTATION_0, - rotation - ) - } - - @Test - fun assert_device_orientation_is_portrait() { - val orientationAngles = FloatArray(3) - orientationAngles[1] = -(Math.PI / 2).toFloat() - orientationAngles[2] = -0f - - val orientation = mUtils.convertToDeviceOrientationFrom(orientationAngles) - - assertEquals( - "When pitch is half PI radians and roll is -0 radians, orientation should be portrait", - Orientation.PORTRAIT, - orientation - ) - } - - @Test - fun assert_device_orientation_is_landscape_right() { - val orientationAngles = FloatArray(3) - orientationAngles[1] = 0f - orientationAngles[2] = (Math.PI / 2).toFloat() - - val orientation = mUtils.convertToDeviceOrientationFrom(orientationAngles) - - assertEquals( - "When pitch is 0 radians and roll is half PI radians, orientation should be landscape right", - Orientation.LANDSCAPE_RIGHT, - orientation - ) - } - - @Test - fun assert_device_orientation_is_portrait_upside_down() { - val orientationAngles = FloatArray(3) - orientationAngles[1] = (Math.PI / 2).toFloat() - orientationAngles[2] = 0f - - val orientation = mUtils.convertToDeviceOrientationFrom(orientationAngles) - - assertEquals( - "When pitch is half PI radians and roll is 0 radians, orientation should be portrait upside down", - Orientation.PORTRAIT_UPSIDE_DOWN, orientation - ) - } - - @Test - fun assert_device_orientation_is_landscape_left() { - val orientationAngles = FloatArray(3) - orientationAngles[1] = 0f - orientationAngles[2] = -(Math.PI / 2).toFloat() - - val orientation = mUtils.convertToDeviceOrientationFrom(orientationAngles) - - assertEquals( - "When pitch is 0 radians and roll is negative half PI radians, orientation should be landscape left", - Orientation.LANDSCAPE_LEFT, - orientation - ) - } - - @Test - fun assert_device_orientation_is_face_down() { - val orientationAngles = FloatArray(3) - orientationAngles[1] = 0f - orientationAngles[2] = -(Math.PI).toFloat() - - val orientation = mUtils.convertToDeviceOrientationFrom(orientationAngles) - - assertEquals( - "When pitch is 0 radians and roll is negative PI radians, orientation should be face down", - Orientation.FACE_DOWN, - orientation - ) - } - - @Test - fun assert_device_orientation_is_face_up() { - val orientationAngles = FloatArray(3) - orientationAngles[1] = 0f - orientationAngles[2] = -0f - - val orientation = mUtils.convertToDeviceOrientationFrom(orientationAngles) - - assertEquals( - "When pitch is 0 radians and roll is negative 0 radians, orientation should be face up", - Orientation.FACE_UP, - orientation - ) - } - - @Test - fun assert_activity_orientation_conversion_from_portrait() { - val activityOrientation = mUtils.convertToActivityOrientationFrom(Orientation.PORTRAIT); - - assertEquals( - "When orientation is portrait, activity orientation should be portrait", - ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, - activityOrientation - ) - } - - @Test - fun assert_activity_orientation_conversion_from_landscape_right() { - val activityOrientation = mUtils.convertToActivityOrientationFrom(Orientation.LANDSCAPE_RIGHT); - - assertEquals( - "When orientation is landscape right, activity orientation should be landscape", - ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, - activityOrientation - ) - } - - @Test - fun assert_activity_orientation_conversion_from_portrait_upside_down() { - val activityOrientation = - mUtils.convertToActivityOrientationFrom(Orientation.PORTRAIT_UPSIDE_DOWN); - - assertEquals( - "When orientation is portrait upside down, activity orientation should be reverse portrait", - ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT, - activityOrientation - ) - } - - @Test - fun assert_activity_orientation_conversion_from_landscape_left() { - val activityOrientation = mUtils.convertToActivityOrientationFrom(Orientation.LANDSCAPE_LEFT); - - assertEquals( - "When orientation is landscape left, activity orientation should be reverse landscape", - ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE, - activityOrientation - ) - } - - @Test - fun assert_orientation_conversion_from_js_portrait() { - val orientation = mUtils.convertToOrientationFromJsValue(1) - - assertEquals( - "When js value is 1, orientation should be portrait", - Orientation.PORTRAIT, - orientation - ) - } - - @Test - fun assert_orientation_conversion_from_js_landscape_right() { - val orientation = mUtils.convertToOrientationFromJsValue(2) - - assertEquals( - "When js value is 2, orientation should be landscape right", - Orientation.LANDSCAPE_RIGHT, - orientation - ) - } - - @Test - fun assert_orientation_conversion_from_js_portrait_upside_down() { - val orientation = mUtils.convertToOrientationFromJsValue(3) - - assertEquals( - "When js value is 3, orientation should be portrait upside down", - Orientation.PORTRAIT_UPSIDE_DOWN, - orientation - ) - } - - @Test - fun assert_orientation_conversion_from_js_landscape_left() { - val orientation = mUtils.convertToOrientationFromJsValue(4) - - assertEquals( - "When js value is 4, orientation should be landscape left", - Orientation.LANDSCAPE_LEFT, - orientation - ) - } - - @Test - fun assert_orientation_conversion_from_screen_rotation_0() { - val orientation = mUtils.convertToOrientationFromScreenRotation(Surface.ROTATION_0) - - assertEquals( - "When screen rotation is 0, orientation should be portrait", - Orientation.PORTRAIT, - orientation - ) - } - - @Test - fun assert_orientation_conversion_from_screen_rotation_90() { - val orientation = mUtils.convertToOrientationFromScreenRotation(Surface.ROTATION_90) - - assertEquals( - "When screen rotation is 90, orientation should be landscape left", - Orientation.LANDSCAPE_LEFT, - orientation - ) - } - - @Test - fun assert_orientation_conversion_from_screen_rotation_180() { - val orientation = mUtils.convertToOrientationFromScreenRotation(Surface.ROTATION_180) - - assertEquals( - "When screen rotation is 180, orientation should be portrait upside down", - Orientation.PORTRAIT_UPSIDE_DOWN, - orientation - ) - } - - @Test - fun assert_orientation_conversion_from_screen_rotation_270() { - val orientation = mUtils.convertToOrientationFromScreenRotation(Surface.ROTATION_270) - - assertEquals( - "When screen rotation is 270, orientation should be landscape right", - Orientation.LANDSCAPE_RIGHT, - orientation - ) - } - - @Test - fun assert_interface_orientation_conversion_from_device_portrait() { - val orientation = mUtils.convertToInterfaceOrientationFrom(Orientation.PORTRAIT) - - assertEquals( - "When device orientation is portrait, interface orientation should be portrait", - Orientation.PORTRAIT, - orientation - ) - } - - @Test - fun assert_interface_orientation_conversion_from_device_landscape_right() { - val orientation = mUtils.convertToInterfaceOrientationFrom(Orientation.LANDSCAPE_RIGHT) - - assertEquals( - "When device orientation is landscape right, interface orientation should be landscape left", - Orientation.LANDSCAPE_LEFT, - orientation - ) - } - - @Test - fun assert_interface_orientation_conversion_from_device_portrait_upside_down() { - val orientation = mUtils.convertToInterfaceOrientationFrom(Orientation.PORTRAIT_UPSIDE_DOWN) - - assertEquals( - "When device orientation is portrait upside down, interface orientation should be portrait upside down", - Orientation.PORTRAIT_UPSIDE_DOWN, - orientation - ) - } - - @Test - fun assert_interface_orientation_conversion_from_device_landscape_left() { - val orientation = mUtils.convertToInterfaceOrientationFrom(Orientation.LANDSCAPE_LEFT) - - assertEquals( - "When device orientation is landscape left, interface orientation should be landscape right", - Orientation.LANDSCAPE_RIGHT, - orientation - ) - } -} From e6ba69f8a10e2cfdfe69b3f4df89ab93cc859f69 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sun, 15 Mar 2026 13:04:12 +0100 Subject: [PATCH 11/18] chore: update README --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 3d529b4..6ff98a3 100644 --- a/README.md +++ b/README.md @@ -195,11 +195,6 @@ differently than on iOS, mainly in the following ways: This behavior allows us to follow Google's best practices related to the Sensors Framework. More [here](https://developer.android.com/develop/sensors-and-location/sensors/sensors_overview#sensors-practices). -## Roadmap - -- [ ] Add JS side tests -- [ ] Add iOS side tests - ## Contributing See the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow. From 70bcc0b3a020104b8593ca3bc58e60b9aab10b63 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sun, 15 Mar 2026 13:19:23 +0100 Subject: [PATCH 12/18] fix: readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6ff98a3..fbfd8aa 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ Then, in your AppDelegate.swift file, implement the supportedInterfaceOrientatio ```swift -#import "OrientationDirector.h" +import OrientationDirector func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return SharedOrientationDirectorImpl.shared.supportedInterfaceOrientations From a8e4ce21ec1a81ed27883749b036671fda41a658 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sun, 15 Mar 2026 14:02:21 +0100 Subject: [PATCH 13/18] fix: readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fbfd8aa..d0b66b4 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ Nothing else is required for Android. To properly handle interface orientation changes in iOS, you need to update your AppDelegate file. Follow the instructions below to set it up: -Then, in your AppDelegate.swift file, implement the supportedInterfaceOrientationsFor method as follows: +In your AppDelegate.swift file, implement the supportedInterfaceOrientationsFor method as follows: ```swift From f385325496fc88af59e2cd2d6697b5d94faadcfc Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sun, 15 Mar 2026 18:55:00 +0100 Subject: [PATCH 14/18] fix(iOS): broken eventManager methods usages --- ios/implementation/OrientationDirectorImpl.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/implementation/OrientationDirectorImpl.swift b/ios/implementation/OrientationDirectorImpl.swift index 57665b2..e47d55b 100644 --- a/ios/implementation/OrientationDirectorImpl.swift +++ b/ios/implementation/OrientationDirectorImpl.swift @@ -176,7 +176,7 @@ import UIKit let deviceOrientation = utils.convertToOrientationFrom(deviceOrientation: uiDeviceOrientation) if (!self.isLocking) { - self.eventManager.sendDeviceOrientationDidChange(orientationValue: deviceOrientation.rawValue) + self.eventManager.sendDeviceOrientationDidChange(value: deviceOrientation.rawValue) } lastDeviceOrientation = deviceOrientation @@ -203,7 +203,7 @@ import UIKit } private func updateLastInterfaceOrientationTo(value: Orientation) { - self.eventManager.sendInterfaceOrientationDidChange(orientationValue: value.rawValue) + self.eventManager.sendInterfaceOrientationDidChange(value: value.rawValue) lastInterfaceOrientation = value } From e74268001ca9da3f0dd23c36d10263886b8146bf Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sun, 15 Mar 2026 19:00:11 +0100 Subject: [PATCH 15/18] chore: remove useless code --- src/module.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/module.ts b/src/module.ts index 1a5458e..4bed768 100644 --- a/src/module.ts +++ b/src/module.ts @@ -1,4 +1,4 @@ -import { NativeEventEmitter, NativeModules, Platform } from 'react-native'; +import { NativeModules, Platform } from 'react-native'; import type { Spec } from './NativeOrientationDirector'; const LINKING_ERROR = @@ -25,6 +25,4 @@ const OrientationDirectorModule = Module } ); -export const ModuleEventEmitter = new NativeEventEmitter(Module); - export default OrientationDirectorModule as Spec; From 9a032a52e4b42292d11396b3811a911703a07a49 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sun, 15 Mar 2026 19:00:26 +0100 Subject: [PATCH 16/18] fix(iOS): missing isJsListening definition --- ios/OrientationDirector.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ios/OrientationDirector.h b/ios/OrientationDirector.h index aeed0ca..b7b5008 100644 --- a/ios/OrientationDirector.h +++ b/ios/OrientationDirector.h @@ -2,4 +2,6 @@ @interface OrientationDirector : NativeOrientationDirectorSpecBase +@property (nonatomic, assign) BOOL isJsListening; + @end From 682522f83dda6c3956416e293646c3560a191974 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sun, 15 Mar 2026 19:09:22 +0100 Subject: [PATCH 17/18] fix(iOS): remove isJsListening usages --- ios/OrientationDirector.h | 2 -- ios/OrientationDirector.mm | 8 -------- ios/implementation/EventManager.swift | 14 -------------- 3 files changed, 24 deletions(-) diff --git a/ios/OrientationDirector.h b/ios/OrientationDirector.h index b7b5008..aeed0ca 100644 --- a/ios/OrientationDirector.h +++ b/ios/OrientationDirector.h @@ -2,6 +2,4 @@ @interface OrientationDirector : NativeOrientationDirectorSpecBase -@property (nonatomic, assign) BOOL isJsListening; - @end diff --git a/ios/OrientationDirector.mm b/ios/OrientationDirector.mm index 728c7bf..8dd30db 100644 --- a/ios/OrientationDirector.mm +++ b/ios/OrientationDirector.mm @@ -43,14 +43,6 @@ + (BOOL)requiresMainQueueSetup /////////////////////////////////////////////////////////////////////////////////////// /// EVENT EMITTER SETUP /// --(void)startObserving { - self.isJsListening = YES; -} - --(void)stopObserving { - self.isJsListening = NO; -} - -(void)emitOnDeviceOrientationDidChangeWithParams:(NSDictionary*)params { [self emitOnDeviceOrientationChanged:params]; } diff --git a/ios/implementation/EventManager.swift b/ios/implementation/EventManager.swift index ed00ec2..0d32361 100644 --- a/ios/implementation/EventManager.swift +++ b/ios/implementation/EventManager.swift @@ -15,10 +15,6 @@ public class EventManager: NSObject { return } - if !delegate.isJsListening { - return - } - let params = Dictionary(dictionaryLiteral: ("orientation", value)) delegate.emitOnDeviceOrientationDidChange(params: params as NSDictionary) } @@ -28,10 +24,6 @@ public class EventManager: NSObject { return } - if !delegate.isJsListening { - return - } - let params = Dictionary(dictionaryLiteral: ("orientation", value)) delegate.emitOnInterfaceOrientationDidChange(params: params as NSDictionary) } @@ -41,18 +33,12 @@ public class EventManager: NSObject { return } - if !delegate.isJsListening { - return - } - let params = Dictionary(dictionaryLiteral: ("locked", value)) delegate.emitOnLockChanged(params: params as NSDictionary) } } @objc public protocol OrientationEventEmitterDelegate { - var isJsListening: Bool { get set } - func emitOnLockChanged(params: NSDictionary) func emitOnDeviceOrientationDidChange(params: NSDictionary) func emitOnInterfaceOrientationDidChange(params: NSDictionary) From ba1ce039ad95849d3ab29e45ab55e9dc87613b35 Mon Sep 17 00:00:00 2001 From: gladiuscode Date: Sun, 15 Mar 2026 21:18:38 +0100 Subject: [PATCH 18/18] feat(expo): upgrade plugin setup to 54 --- app.plugin.js | 2 +- package.json | 4 +- ... => withAndroidConfiguration.spec.ts.snap} | 6 +- ...snap => withIosConfiguration.spec.ts.snap} | 6 +- ...ec.ts => withAndroidConfiguration.spec.ts} | 5 +- ...e.spec.ts => withIosConfiguration.spec.ts} | 7 +- plugin/package.json | 18 +- plugin/src/index.ts | 37 +- ...ctivity.ts => withAndroidConfiguration.ts} | 7 +- ...AppDelegate.ts => withIosConfiguration.ts} | 11 +- plugin/tsconfig.json | 2 +- yarn.lock | 1268 ++++++++++++----- 12 files changed, 917 insertions(+), 456 deletions(-) rename plugin/__tests__/__snapshots__/{withRNOrientationMainActivity.spec.ts.snap => withAndroidConfiguration.spec.ts.snap} (95%) rename plugin/__tests__/__snapshots__/{withRNOrientationAppDelegate.spec.ts.snap => withIosConfiguration.spec.ts.snap} (94%) rename plugin/__tests__/{withRNOrientationMainActivity.spec.ts => withAndroidConfiguration.spec.ts} (90%) rename plugin/__tests__/{withRNOrientationAppDelegate.spec.ts => withIosConfiguration.spec.ts} (91%) rename plugin/src/{withRNOrientationMainActivity.ts => withAndroidConfiguration.ts} (95%) rename plugin/src/{withRNOrientationAppDelegate.ts => withIosConfiguration.ts} (89%) diff --git a/app.plugin.js b/app.plugin.js index 3c7d11b..49df780 100644 --- a/app.plugin.js +++ b/app.plugin.js @@ -1 +1 @@ -module.exports = require('./plugin/build'); +module.exports = require('./lib/plugin'); diff --git a/package.json b/package.json index e5bb3ec..60b2183 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,6 @@ "android", "ios", "cpp", - "plugin/build", - "plugin/tsconfig.json", "app.plugin.js", "*.podspec", "react-native.config.js", @@ -42,7 +40,7 @@ "typecheck": "tsc", "lint": "eslint \"src/**/*.{js,ts,tsx}\" \"example/**/*.{js,ts,tsx}\"", "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib", - "prepare": "bob build", + "prepare": "yarn expo-plugin prepare && bob build", "release": "release-it" }, "keywords": [ diff --git a/plugin/__tests__/__snapshots__/withRNOrientationMainActivity.spec.ts.snap b/plugin/__tests__/__snapshots__/withAndroidConfiguration.spec.ts.snap similarity index 95% rename from plugin/__tests__/__snapshots__/withRNOrientationMainActivity.spec.ts.snap rename to plugin/__tests__/__snapshots__/withAndroidConfiguration.spec.ts.snap index aafa79a..ea0a94d 100644 --- a/plugin/__tests__/__snapshots__/withRNOrientationMainActivity.spec.ts.snap +++ b/plugin/__tests__/__snapshots__/withAndroidConfiguration.spec.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`withRNOrientationMainActivity skips the MainActivity.kt configuration import when it's already set 1`] = ` +exports[`withAndroidConfiguration skips the MainActivity.kt configuration import when it's already set 1`] = ` "package com.orientationdirectorexample import android.content.res.Configuration @@ -57,7 +57,7 @@ class MainActivity : ReactActivity() { " `; -exports[`withRNOrientationMainActivity skips the MainActivity.kt intent import when it's already set 1`] = ` +exports[`withAndroidConfiguration skips the MainActivity.kt intent import when it's already set 1`] = ` "package com.orientationdirectorexample import android.content.Intent @@ -114,7 +114,7 @@ class MainActivity : ReactActivity() { " `; -exports[`withRNOrientationMainActivity updates the MainActivity.kt with both imports and method implementation 1`] = ` +exports[`withAndroidConfiguration updates the MainActivity.kt with both imports and method implementation 1`] = ` "package com.orientationdirectorexample import android.os.Bundle diff --git a/plugin/__tests__/__snapshots__/withRNOrientationAppDelegate.spec.ts.snap b/plugin/__tests__/__snapshots__/withIosConfiguration.spec.ts.snap similarity index 94% rename from plugin/__tests__/__snapshots__/withRNOrientationAppDelegate.spec.ts.snap rename to plugin/__tests__/__snapshots__/withIosConfiguration.spec.ts.snap index a47c446..8f32c50 100644 --- a/plugin/__tests__/__snapshots__/withRNOrientationAppDelegate.spec.ts.snap +++ b/plugin/__tests__/__snapshots__/withIosConfiguration.spec.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`withRNOrientationAppDelegate updates the AppDelegate52.swift with the method implementation having public override when sdk is <= 52 1`] = ` +exports[`withIosConfiguration updates the AppDelegate52.swift with the method implementation having public override when sdk is <= 52 1`] = ` "import UIKit import React import React_RCTAppDelegate @@ -44,7 +44,7 @@ class AppDelegate: RCTAppDelegate { " `; -exports[`withRNOrientationAppDelegate updates the AppDelegate53.swift with the method implementation having public override when sdk is greater than or equal to 54 1`] = ` +exports[`withIosConfiguration updates the AppDelegate53.swift with the method implementation having public override when sdk is greater than or equal to 54 1`] = ` "import Expo import React import ReactAppDependencyProvider @@ -128,7 +128,7 @@ class ReactNativeDelegate: ExpoReactNativeFactoryDelegate { " `; -exports[`withRNOrientationAppDelegate updates the AppDelegate53.swift with the method implementation without public override when sdk is equal to 53 1`] = ` +exports[`withIosConfiguration updates the AppDelegate53.swift with the method implementation without public override when sdk is equal to 53 1`] = ` "import Expo import React import ReactAppDependencyProvider diff --git a/plugin/__tests__/withRNOrientationMainActivity.spec.ts b/plugin/__tests__/withAndroidConfiguration.spec.ts similarity index 90% rename from plugin/__tests__/withRNOrientationMainActivity.spec.ts rename to plugin/__tests__/withAndroidConfiguration.spec.ts index 9802435..bd3d690 100644 --- a/plugin/__tests__/withRNOrientationMainActivity.spec.ts +++ b/plugin/__tests__/withAndroidConfiguration.spec.ts @@ -1,9 +1,8 @@ import * as fs from 'node:fs'; import * as path from 'node:path'; +import { ktFileUpdater } from '../src/withAndroidConfiguration'; -import { ktFileUpdater } from '../src/withRNOrientationMainActivity'; - -describe('withRNOrientationMainActivity', function () { +describe('withAndroidConfiguration', function () { beforeEach(function () { jest.resetAllMocks(); }); diff --git a/plugin/__tests__/withRNOrientationAppDelegate.spec.ts b/plugin/__tests__/withIosConfiguration.spec.ts similarity index 91% rename from plugin/__tests__/withRNOrientationAppDelegate.spec.ts rename to plugin/__tests__/withIosConfiguration.spec.ts index c22d04a..8b8d092 100644 --- a/plugin/__tests__/withRNOrientationAppDelegate.spec.ts +++ b/plugin/__tests__/withIosConfiguration.spec.ts @@ -1,11 +1,8 @@ import * as fs from 'node:fs'; import * as path from 'node:path'; +import { swiftFileUpdater } from '../src/withIosConfiguration'; -import { - swiftFileUpdater, -} from '../src/withRNOrientationAppDelegate'; - -describe('withRNOrientationAppDelegate', function () { +describe('withIosConfiguration', function () { beforeEach(function () { jest.resetAllMocks(); }); diff --git a/plugin/package.json b/plugin/package.json index e6dc0bd..c80d29c 100644 --- a/plugin/package.json +++ b/plugin/package.json @@ -1,22 +1,26 @@ { "name": "react-native-orientation-director-expo-plugin", - "version": "0.0.1", - "private": true, "scripts": { "build": "expo-module build", + "build:plugin": "expo-module build plugin", "clean": "expo-module clean", "test": "expo-module test", "typecheck": "expo-module typecheck", "lint": "expo-module lint", "prepare": "expo-module prepare", - "expo-module": "expo-module" + "prepublishOnly": "expo-module prepublishOnly" }, "devDependencies": { - "expo": "53.0.13", - "expo-module-scripts": "4.1.8", + "expo": "^54.0.0", + "expo-module-scripts": "55.0.2", "glob": "11.0.3" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "expo": ">=54.0.0" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } } } diff --git a/plugin/src/index.ts b/plugin/src/index.ts index 560b83a..23c02c2 100644 --- a/plugin/src/index.ts +++ b/plugin/src/index.ts @@ -1,32 +1,13 @@ -import { - type ConfigPlugin, - createRunOncePlugin, - withPlugins, -} from '@expo/config-plugins'; +import { type ConfigPlugin } from 'expo/config-plugins'; +import { withAndroidConfiguration } from './withAndroidConfiguration'; +import { withIosConfiguration } from './withIosConfiguration'; -import { withRNOrientationAppDelegate } from './withRNOrientationAppDelegate'; -import { withRNOrientationMainActivity } from './withRNOrientationMainActivity'; +const withYourLibrary: ConfigPlugin = (config) => { + config = withAndroidConfiguration(config); -/** - * So, expo config plugin are awesome and the documentation is well written, but I still needed to look around to see - * how other projects actually modify the AppDelegate. I've found react-native-firebase to implement a plugin config - * that changes the AppDelegate, so I'll leave their link as reference: - * https://github.com/invertase/react-native-firebase/blob/main/packages/app/plugin/src/ios/appDelegate.ts - * - * Kudos to them, because this stuff is hard! - * - * @param config - */ -const withRNOrientationDirector: ConfigPlugin = (config) => { - return withPlugins(config, [ - withRNOrientationAppDelegate, - withRNOrientationMainActivity, - ]); + config = withIosConfiguration(config); + + return config; }; -const pak = require('react-native-orientation-director/package.json'); -export default createRunOncePlugin( - withRNOrientationDirector, - pak.name, - pak.version -); +export default withYourLibrary; diff --git a/plugin/src/withRNOrientationMainActivity.ts b/plugin/src/withAndroidConfiguration.ts similarity index 95% rename from plugin/src/withRNOrientationMainActivity.ts rename to plugin/src/withAndroidConfiguration.ts index f9e4473..afee99b 100644 --- a/plugin/src/withRNOrientationMainActivity.ts +++ b/plugin/src/withAndroidConfiguration.ts @@ -1,12 +1,12 @@ +import { type ConfigPlugin } from 'expo/config-plugins'; import { - type ConfigPlugin, type ExportedConfigWithProps, withMainActivity, } from '@expo/config-plugins'; -import { type ApplicationProjectFile } from '@expo/config-plugins/build/android/Paths'; +import type { ApplicationProjectFile } from '@expo/config-plugins/build/android/Paths'; import { mergeContents } from '@expo/config-plugins/build/utils/generateCode'; -export const withRNOrientationMainActivity: ConfigPlugin = (config) => { +export const withAndroidConfiguration: ConfigPlugin = (config) => { return withMainActivity(config, readMainActivityFileAndUpdateContents); }; @@ -110,6 +110,7 @@ function updateContentsWithSystemImports(originalContents: string) { return mergeResults.contents; } + function addConfigurationImportIfNecessary(_contents: string) { const systemConfigurationImportCodeBlock = 'import android.content.res.Configuration'; diff --git a/plugin/src/withRNOrientationAppDelegate.ts b/plugin/src/withIosConfiguration.ts similarity index 89% rename from plugin/src/withRNOrientationAppDelegate.ts rename to plugin/src/withIosConfiguration.ts index feb1a30..bb72308 100644 --- a/plugin/src/withRNOrientationAppDelegate.ts +++ b/plugin/src/withIosConfiguration.ts @@ -1,12 +1,9 @@ -import { - type ConfigPlugin, - type ExportedConfigWithProps, - withAppDelegate, -} from '@expo/config-plugins'; -import { type AppDelegateProjectFile } from '@expo/config-plugins/build/ios/Paths'; +import { type ConfigPlugin } from 'expo/config-plugins'; +import { ExportedConfigWithProps, withAppDelegate } from '@expo/config-plugins'; +import { AppDelegateProjectFile } from '@expo/config-plugins/build/ios/Paths'; import { mergeContents } from '@expo/config-plugins/build/utils/generateCode'; -export const withRNOrientationAppDelegate: ConfigPlugin = (config) => { +export const withIosConfiguration: ConfigPlugin = (config) => { return withAppDelegate(config, readAppDelegateFileAndUpdateContents); }; diff --git a/plugin/tsconfig.json b/plugin/tsconfig.json index 354bddb..0e0fb88 100644 --- a/plugin/tsconfig.json +++ b/plugin/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "expo-module-scripts/tsconfig.plugin", "compilerOptions": { - "outDir": "build", + "outDir": "../lib/plugin", "rootDir": "src" }, "include": ["./src"], diff --git a/yarn.lock b/yarn.lock index 4dc274b..31b8a70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -60,7 +60,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.20.0, @babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.20.0, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": version: 7.29.0 resolution: "@babel/code-frame@npm:7.29.0" dependencies: @@ -124,7 +124,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.20.5, @babel/generator@npm:^7.29.0, @babel/generator@npm:^7.29.1, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.20.5, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.29.0, @babel/generator@npm:^7.29.1, @babel/generator@npm:^7.7.2": version: 7.29.1 resolution: "@babel/generator@npm:7.29.1" dependencies: @@ -350,7 +350,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.4, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": +"@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.4, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": version: 7.29.0 resolution: "@babel/parser@npm:7.29.0" dependencies: @@ -778,7 +778,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.28.6": +"@babel/plugin-transform-class-static-block@npm:^7.27.1, @babel/plugin-transform-class-static-block@npm:^7.28.6": version: 7.28.6 resolution: "@babel/plugin-transform-class-static-block@npm:7.28.6" dependencies: @@ -1575,7 +1575,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": version: 7.29.0 resolution: "@babel/traverse@npm:7.29.0" dependencies: @@ -1590,7 +1590,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.2, @babel/types@npm:^7.26.0, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": version: 7.29.0 resolution: "@babel/types@npm:7.29.0" dependencies: @@ -1919,28 +1919,29 @@ __metadata: languageName: node linkType: hard -"@expo/cli@npm:0.24.15": - version: 0.24.15 - resolution: "@expo/cli@npm:0.24.15" +"@expo/cli@npm:54.0.23": + version: 54.0.23 + resolution: "@expo/cli@npm:54.0.23" dependencies: "@0no-co/graphql.web": "npm:^1.0.8" - "@babel/runtime": "npm:^7.20.0" - "@expo/code-signing-certificates": "npm:^0.0.5" - "@expo/config": "npm:~11.0.10" - "@expo/config-plugins": "npm:~10.0.3" - "@expo/devcert": "npm:^1.1.2" - "@expo/env": "npm:~1.0.5" - "@expo/image-utils": "npm:^0.7.4" - "@expo/json-file": "npm:^9.1.4" - "@expo/metro-config": "npm:~0.20.15" - "@expo/osascript": "npm:^2.2.4" - "@expo/package-manager": "npm:^1.8.4" - "@expo/plist": "npm:^0.3.4" - "@expo/prebuild-config": "npm:^9.0.7" + "@expo/code-signing-certificates": "npm:^0.0.6" + "@expo/config": "npm:~12.0.13" + "@expo/config-plugins": "npm:~54.0.4" + "@expo/devcert": "npm:^1.2.1" + "@expo/env": "npm:~2.0.8" + "@expo/image-utils": "npm:^0.8.8" + "@expo/json-file": "npm:^10.0.8" + "@expo/metro": "npm:~54.2.0" + "@expo/metro-config": "npm:~54.0.14" + "@expo/osascript": "npm:^2.3.8" + "@expo/package-manager": "npm:^1.9.10" + "@expo/plist": "npm:^0.4.8" + "@expo/prebuild-config": "npm:^54.0.8" + "@expo/schema-utils": "npm:^0.1.8" "@expo/spawn-async": "npm:^1.7.2" "@expo/ws-tunnel": "npm:^1.0.1" "@expo/xcpretty": "npm:^4.3.0" - "@react-native/dev-middleware": "npm:0.79.4" + "@react-native/dev-middleware": "npm:0.81.5" "@urql/core": "npm:^5.0.6" "@urql/exchange-retry": "npm:^1.3.0" accepts: "npm:^1.3.8" @@ -1954,12 +1955,13 @@ __metadata: connect: "npm:^3.7.0" debug: "npm:^4.3.4" env-editor: "npm:^0.4.1" + expo-server: "npm:^1.0.5" freeport-async: "npm:^2.0.0" getenv: "npm:^2.0.0" - glob: "npm:^10.4.2" + glob: "npm:^13.0.0" lan-network: "npm:^0.1.6" minimatch: "npm:^9.0.0" - node-forge: "npm:^1.3.1" + node-forge: "npm:^1.3.3" npm-package-arg: "npm:^11.0.0" ora: "npm:^3.4.0" picomatch: "npm:^3.0.1" @@ -1979,100 +1981,133 @@ __metadata: source-map-support: "npm:~0.5.21" stacktrace-parser: "npm:^0.1.10" structured-headers: "npm:^0.4.1" - tar: "npm:^7.4.3" + tar: "npm:^7.5.2" terminal-link: "npm:^2.1.1" undici: "npm:^6.18.2" wrap-ansi: "npm:^7.0.0" ws: "npm:^8.12.1" + peerDependencies: + expo: "*" + expo-router: "*" + react-native: "*" + peerDependenciesMeta: + expo-router: + optional: true + react-native: + optional: true bin: expo-internal: build/bin/cli - checksum: 10/ae26112b39a83459a36b544238fd240b40f73fad939d3fa56e7af303ab1d414b9f8159a3d09068015930e79a6e62200a3fd89dfbaff8f4604fce292248d9430f + checksum: 10/9a41c55aa7f628ad44048c9f41cd8d7f4f73a8bfc01adaa956ddaae87d332ae979eadb52bdab894ef5b1c9b5722486ccdb999057d8b9eed392c827f476feb79f languageName: node linkType: hard -"@expo/code-signing-certificates@npm:^0.0.5": - version: 0.0.5 - resolution: "@expo/code-signing-certificates@npm:0.0.5" +"@expo/code-signing-certificates@npm:^0.0.6": + version: 0.0.6 + resolution: "@expo/code-signing-certificates@npm:0.0.6" dependencies: - node-forge: "npm:^1.2.1" - nullthrows: "npm:^1.1.1" - checksum: 10/6783721e2eafff5547500eaf99bee54641f076dc7221e52b48f1494f993040d779fe13ae7d95d3874c483eb545cafbf692315e2da0b0fc24e7a477b84e289617 + node-forge: "npm:^1.3.3" + checksum: 10/4446cca45e8b48b90ba728e39aab6b1195ede730d7aba7d9830f635aa16a52634e6eba9dc510f83cc6ff6fb6b0e3077bc6021098f0157f6dba96f8494685c388 languageName: node linkType: hard -"@expo/config-plugins@npm:~10.0.3": - version: 10.0.3 - resolution: "@expo/config-plugins@npm:10.0.3" +"@expo/config-plugins@npm:~54.0.4": + version: 54.0.4 + resolution: "@expo/config-plugins@npm:54.0.4" dependencies: - "@expo/config-types": "npm:^53.0.4" - "@expo/json-file": "npm:~9.1.4" - "@expo/plist": "npm:^0.3.4" + "@expo/config-types": "npm:^54.0.10" + "@expo/json-file": "npm:~10.0.8" + "@expo/plist": "npm:^0.4.8" "@expo/sdk-runtime-versions": "npm:^1.0.0" chalk: "npm:^4.1.2" debug: "npm:^4.3.5" getenv: "npm:^2.0.0" - glob: "npm:^10.4.2" + glob: "npm:^13.0.0" resolve-from: "npm:^5.0.0" semver: "npm:^7.5.4" slash: "npm:^3.0.0" slugify: "npm:^1.6.6" xcode: "npm:^3.0.1" xml2js: "npm:0.6.0" - checksum: 10/0e288f6c7eef4376e516c420fc28514b640eaafbce2b83e4cdda08585240c82106e6ff2f95f2ffa0c2eda50a597a212603a6547bf4e42fc45fad415102c724c7 + checksum: 10/55dab3f5f29b6dfb58bc32a9b0a681766f6b260ee94b1c295f67ac3c5e8f372afc512bb416f2e50901e387d4012e3a4a8fd3b461e5aa8c20e16fdcde64a07327 languageName: node linkType: hard -"@expo/config-plugins@npm:~10.1.2": - version: 10.1.2 - resolution: "@expo/config-plugins@npm:10.1.2" +"@expo/config-plugins@npm:~55.0.6": + version: 55.0.6 + resolution: "@expo/config-plugins@npm:55.0.6" dependencies: - "@expo/config-types": "npm:^53.0.5" - "@expo/json-file": "npm:~9.1.5" - "@expo/plist": "npm:^0.3.5" + "@expo/config-types": "npm:^55.0.5" + "@expo/json-file": "npm:~10.0.12" + "@expo/plist": "npm:^0.5.2" "@expo/sdk-runtime-versions": "npm:^1.0.0" chalk: "npm:^4.1.2" debug: "npm:^4.3.5" getenv: "npm:^2.0.0" - glob: "npm:^10.4.2" + glob: "npm:^13.0.0" resolve-from: "npm:^5.0.0" semver: "npm:^7.5.4" - slash: "npm:^3.0.0" slugify: "npm:^1.6.6" xcode: "npm:^3.0.1" xml2js: "npm:0.6.0" - checksum: 10/01281c474513e4c3aa5b0cb0c9da5b1fdb625fe529d078b11c733d84d771c0514ec7b37741df94d4bcde4c3fb8189df324d1fa1d58afc8a716f48fab5a60e293 + checksum: 10/2805380b694f9e21c7e2bfaba0ad6a8266af6093f7fc4ba413b5a7099329620eaecbbaa070c506f8e5eb06c8cb605f48e7491adba6ddf989e36bff14a396c48a languageName: node linkType: hard -"@expo/config-types@npm:^53.0.4, @expo/config-types@npm:^53.0.5": - version: 53.0.5 - resolution: "@expo/config-types@npm:53.0.5" - checksum: 10/71971858185b6163459271734903258c9cdd26a0ffc9775d038f37ebb71ab07153494b0157b96eed03600789592862458e81dfbcc8ef440d28fdcf965f0ba012 +"@expo/config-types@npm:^54.0.10": + version: 54.0.10 + resolution: "@expo/config-types@npm:54.0.10" + checksum: 10/7e4d598d2d1905dc53f2b30d5a1e0817dd486b13c89a24575deb4e25ec441b0de009d156f041a3c9a1f2121dfba28f2a24fd4fb5a056cac90502ca67c639bb8a languageName: node linkType: hard -"@expo/config@npm:~11.0.10, @expo/config@npm:~11.0.13": - version: 11.0.13 - resolution: "@expo/config@npm:11.0.13" +"@expo/config-types@npm:^55.0.5": + version: 55.0.5 + resolution: "@expo/config-types@npm:55.0.5" + checksum: 10/9a7b5a025218618b6810d720663ef973b5497baedb194ed29ed60f4aa3d4b012676e57c71807a96aa78f099d562030b3246ae403776b46e0db56db68c6f3ac82 + languageName: node + linkType: hard + +"@expo/config@npm:~12.0.13": + version: 12.0.13 + resolution: "@expo/config@npm:12.0.13" dependencies: "@babel/code-frame": "npm:~7.10.4" - "@expo/config-plugins": "npm:~10.1.2" - "@expo/config-types": "npm:^53.0.5" - "@expo/json-file": "npm:^9.1.5" + "@expo/config-plugins": "npm:~54.0.4" + "@expo/config-types": "npm:^54.0.10" + "@expo/json-file": "npm:^10.0.8" deepmerge: "npm:^4.3.1" getenv: "npm:^2.0.0" - glob: "npm:^10.4.2" + glob: "npm:^13.0.0" require-from-string: "npm:^2.0.2" resolve-from: "npm:^5.0.0" resolve-workspace-root: "npm:^2.0.0" semver: "npm:^7.6.0" slugify: "npm:^1.3.4" - sucrase: "npm:3.35.0" - checksum: 10/b81511676c243d712fe31af123752cbd8cf1d09f42f2dd5df3827f2ce5bcb84233bf90e1cfa255fcb89eecf82b6a992a32bb0d38fea8f920f4afed09a659fe68 + sucrase: "npm:~3.35.1" + checksum: 10/2caac758fb706a75fc6d07df31c24c22d633f522091148e615d9c28475ae35cfaed29458cfd08f13d40d71d33715e5ac618af78591c11886529157b8519fe4ea languageName: node linkType: hard -"@expo/devcert@npm:^1.1.2": +"@expo/config@npm:~55.0.8": + version: 55.0.8 + resolution: "@expo/config@npm:55.0.8" + dependencies: + "@expo/config-plugins": "npm:~55.0.6" + "@expo/config-types": "npm:^55.0.5" + "@expo/json-file": "npm:^10.0.12" + "@expo/require-utils": "npm:^55.0.2" + deepmerge: "npm:^4.3.1" + getenv: "npm:^2.0.0" + glob: "npm:^13.0.0" + resolve-from: "npm:^5.0.0" + resolve-workspace-root: "npm:^2.0.0" + semver: "npm:^7.6.0" + slugify: "npm:^1.3.4" + checksum: 10/028a8ebe0684191697672f2e346755d63f1bf97ad6a39dbf88998f9b9a53cbdf7296219a851d3b947125faf38f6bc690b627ccc9e8bac4c450e3a1101963f068 + languageName: node + linkType: hard + +"@expo/devcert@npm:^1.2.1": version: 1.2.1 resolution: "@expo/devcert@npm:1.2.1" dependencies: @@ -2082,30 +2117,46 @@ __metadata: languageName: node linkType: hard -"@expo/env@npm:~1.0.5, @expo/env@npm:~1.0.7": - version: 1.0.7 - resolution: "@expo/env@npm:1.0.7" +"@expo/devtools@npm:0.1.8": + version: 0.1.8 + resolution: "@expo/devtools@npm:0.1.8" + dependencies: + chalk: "npm:^4.1.2" + peerDependencies: + react: "*" + react-native: "*" + peerDependenciesMeta: + react: + optional: true + react-native: + optional: true + checksum: 10/ecbf927c91b45697c53a528f77ddcc63b6bad4efc29af18f9d6f7aa0d1e6e47c8b2a061dfa29b3ebb470ce3b4c95e40dbcf51066b0ff1db17c7d1be88fe162f1 + languageName: node + linkType: hard + +"@expo/env@npm:~2.0.8": + version: 2.0.11 + resolution: "@expo/env@npm:2.0.11" dependencies: chalk: "npm:^4.0.0" debug: "npm:^4.3.4" dotenv: "npm:~16.4.5" dotenv-expand: "npm:~11.0.6" getenv: "npm:^2.0.0" - checksum: 10/3275e4be6a2e190cdece4238d44243cbc94ada2720b7cd45a1d9a3775c0b73bc087b756f1558a1e5b3a6dc723e5c2d4f52c25c10a7086193097df61ea4c1a2d4 + checksum: 10/bfb307d6b35d47c58f82424c85543325370bbdc0f303cdd4ddfe5d6854e0386ad72166fec6e1da633fc7cb3b0915d7c40642c49773ae31e6faed13569d1b601c languageName: node linkType: hard -"@expo/fingerprint@npm:0.13.1": - version: 0.13.1 - resolution: "@expo/fingerprint@npm:0.13.1" +"@expo/fingerprint@npm:0.15.4": + version: 0.15.4 + resolution: "@expo/fingerprint@npm:0.15.4" dependencies: "@expo/spawn-async": "npm:^1.7.2" arg: "npm:^5.0.2" chalk: "npm:^4.1.2" debug: "npm:^4.3.4" - find-up: "npm:^5.0.0" getenv: "npm:^2.0.0" - glob: "npm:^10.4.2" + glob: "npm:^13.0.0" ignore: "npm:^5.3.1" minimatch: "npm:^9.0.0" p-limit: "npm:^3.1.0" @@ -2113,13 +2164,13 @@ __metadata: semver: "npm:^7.6.0" bin: fingerprint: bin/cli.js - checksum: 10/ef9257e32191103245978b1947b9d761c28012ca2432025c7254311396c5b85e7a094ec4080e09457dbf99954824327c823d9990116aa8b82804e9e1dde1a69b + checksum: 10/854c5b8c298d145d58d47d45081f14fd1fc3c4880e6706257c4863ea4e56a368d055d1043538c74e35f5b23971c945bcd3e62750ffe23d2210f73d3712447b5a languageName: node linkType: hard -"@expo/image-utils@npm:^0.7.4, @expo/image-utils@npm:^0.7.6": - version: 0.7.6 - resolution: "@expo/image-utils@npm:0.7.6" +"@expo/image-utils@npm:^0.8.8": + version: 0.8.12 + resolution: "@expo/image-utils@npm:0.8.12" dependencies: "@expo/spawn-async": "npm:^1.7.2" chalk: "npm:^4.0.0" @@ -2128,13 +2179,11 @@ __metadata: parse-png: "npm:^2.1.0" resolve-from: "npm:^5.0.0" semver: "npm:^7.6.0" - temp-dir: "npm:~2.0.0" - unique-string: "npm:~2.0.0" - checksum: 10/455cd36137f0a2691a78a54dbe624e8c92ff924879f15537a9640a8208c9d4877c6071f4aa96b2cd6dc39cbde35ca6c67272e1a0062ce920c2f8669614558080 + checksum: 10/fb474558bb4009f39c640fb028a57cfae721e52dae0085bb2505390c6968d30cdc82eb195c15de82f30879c710104c08e60120de8f49613183437701f19dd363 languageName: node linkType: hard -"@expo/json-file@npm:^10.0.12": +"@expo/json-file@npm:^10.0.12, @expo/json-file@npm:^10.0.8, @expo/json-file@npm:~10.0.12, @expo/json-file@npm:~10.0.8": version: 10.0.12 resolution: "@expo/json-file@npm:10.0.12" dependencies: @@ -2144,67 +2193,59 @@ __metadata: languageName: node linkType: hard -"@expo/json-file@npm:^9.1.4, @expo/json-file@npm:^9.1.5, @expo/json-file@npm:~9.1.4, @expo/json-file@npm:~9.1.5": - version: 9.1.5 - resolution: "@expo/json-file@npm:9.1.5" - dependencies: - "@babel/code-frame": "npm:~7.10.4" - json5: "npm:^2.2.3" - checksum: 10/b4a8019ac68ffb04606b03ff2fbec81ed031a9bbb2e9f21ba5e7a74f36d68ad1aa68111342ac26d2082f1322b5eb343ad0976b51793599501f33160cd92c25be - languageName: node - linkType: hard - -"@expo/metro-config@npm:0.20.15": - version: 0.20.15 - resolution: "@expo/metro-config@npm:0.20.15" +"@expo/metro-config@npm:54.0.14, @expo/metro-config@npm:~54.0.14": + version: 54.0.14 + resolution: "@expo/metro-config@npm:54.0.14" dependencies: + "@babel/code-frame": "npm:^7.20.0" "@babel/core": "npm:^7.20.0" "@babel/generator": "npm:^7.20.5" - "@babel/parser": "npm:^7.20.0" - "@babel/types": "npm:^7.20.0" - "@expo/config": "npm:~11.0.10" - "@expo/env": "npm:~1.0.5" - "@expo/json-file": "npm:~9.1.4" + "@expo/config": "npm:~12.0.13" + "@expo/env": "npm:~2.0.8" + "@expo/json-file": "npm:~10.0.8" + "@expo/metro": "npm:~54.2.0" "@expo/spawn-async": "npm:^1.7.2" + browserslist: "npm:^4.25.0" chalk: "npm:^4.1.0" debug: "npm:^4.3.2" dotenv: "npm:~16.4.5" dotenv-expand: "npm:~11.0.6" getenv: "npm:^2.0.0" - glob: "npm:^10.4.2" + glob: "npm:^13.0.0" + hermes-parser: "npm:^0.29.1" jsc-safe-url: "npm:^0.2.4" - lightningcss: "npm:~1.27.0" + lightningcss: "npm:^1.30.1" minimatch: "npm:^9.0.0" postcss: "npm:~8.4.32" resolve-from: "npm:^5.0.0" - checksum: 10/66894ca241a61e7739572b54fb96ba7a5390f7c71c01f17aaaf4787df87685d05628dd9f75eb84b2c07a20998cea2756756e239d196ef2cb7d1c2173be52855c + peerDependencies: + expo: "*" + peerDependenciesMeta: + expo: + optional: true + checksum: 10/c1a67c187fcd9f3dd43cd1b33a500644715768ab55939d5e2ff354311709ea5fed2bb3c103610b0ddac961d7ab2f94f7a1d1f25d033af98690ed6b9cec9ac787 languageName: node linkType: hard -"@expo/metro-config@npm:~0.20.15": - version: 0.20.18 - resolution: "@expo/metro-config@npm:0.20.18" +"@expo/metro@npm:~54.2.0": + version: 54.2.0 + resolution: "@expo/metro@npm:54.2.0" dependencies: - "@babel/core": "npm:^7.20.0" - "@babel/generator": "npm:^7.20.5" - "@babel/parser": "npm:^7.20.0" - "@babel/types": "npm:^7.20.0" - "@expo/config": "npm:~11.0.13" - "@expo/env": "npm:~1.0.7" - "@expo/json-file": "npm:~9.1.5" - "@expo/spawn-async": "npm:^1.7.2" - chalk: "npm:^4.1.0" - debug: "npm:^4.3.2" - dotenv: "npm:~16.4.5" - dotenv-expand: "npm:~11.0.6" - getenv: "npm:^2.0.0" - glob: "npm:^10.4.2" - jsc-safe-url: "npm:^0.2.4" - lightningcss: "npm:~1.27.0" - minimatch: "npm:^9.0.0" - postcss: "npm:~8.4.32" - resolve-from: "npm:^5.0.0" - checksum: 10/e43bf8286e6c37beb77b6f8ee29cd1eaa45de53367be8d8dff8458bd92e4442e3fc4148ed7d4d30a117e6730c1adc063c89557b88f4ae9645015f72ec05f5a6e + metro: "npm:0.83.3" + metro-babel-transformer: "npm:0.83.3" + metro-cache: "npm:0.83.3" + metro-cache-key: "npm:0.83.3" + metro-config: "npm:0.83.3" + metro-core: "npm:0.83.3" + metro-file-map: "npm:0.83.3" + metro-minify-terser: "npm:0.83.3" + metro-resolver: "npm:0.83.3" + metro-runtime: "npm:0.83.3" + metro-source-map: "npm:0.83.3" + metro-symbolicate: "npm:0.83.3" + metro-transform-plugins: "npm:0.83.3" + metro-transform-worker: "npm:0.83.3" + checksum: 10/36087cec4cb1788f6c8f6148f9dcd30e8d3693fbf8a14f8b0a3c9575895bd6b1847690c958181d7e92718d49ab66df285a79d64ff3c13e4168bbfee26b670d7f languageName: node linkType: hard @@ -2219,7 +2260,7 @@ __metadata: languageName: node linkType: hard -"@expo/osascript@npm:^2.2.4": +"@expo/osascript@npm:^2.3.8": version: 2.4.2 resolution: "@expo/osascript@npm:2.4.2" dependencies: @@ -2228,7 +2269,7 @@ __metadata: languageName: node linkType: hard -"@expo/package-manager@npm:^1.8.4": +"@expo/package-manager@npm:^1.9.10": version: 1.10.3 resolution: "@expo/package-manager@npm:1.10.3" dependencies: @@ -2242,32 +2283,68 @@ __metadata: languageName: node linkType: hard -"@expo/plist@npm:^0.3.4, @expo/plist@npm:^0.3.5": - version: 0.3.5 - resolution: "@expo/plist@npm:0.3.5" +"@expo/plist@npm:^0.4.8": + version: 0.4.8 + resolution: "@expo/plist@npm:0.4.8" dependencies: "@xmldom/xmldom": "npm:^0.8.8" base64-js: "npm:^1.2.3" xmlbuilder: "npm:^15.1.1" - checksum: 10/a79f11e21c0072baf32444a0ca38883f966470df44d7bd30b244e4dba2aa1c66e186129d22c1ed7fd4139fd053ec9ae3d9d41a4f6fc36f51306a5b9a455d7676 + checksum: 10/48ba4ad5cc3668e8c26c5197bf7915a29745d0ae1cba1c38aad0d797ee1835ac74fb577a9e810594063e5984d9e52b367f4069d0ef1d906ba3013fce1c01a19c languageName: node linkType: hard -"@expo/prebuild-config@npm:^9.0.7": - version: 9.0.12 - resolution: "@expo/prebuild-config@npm:9.0.12" +"@expo/plist@npm:^0.5.2": + version: 0.5.2 + resolution: "@expo/plist@npm:0.5.2" dependencies: - "@expo/config": "npm:~11.0.13" - "@expo/config-plugins": "npm:~10.1.2" - "@expo/config-types": "npm:^53.0.5" - "@expo/image-utils": "npm:^0.7.6" - "@expo/json-file": "npm:^9.1.5" - "@react-native/normalize-colors": "npm:0.79.6" + "@xmldom/xmldom": "npm:^0.8.8" + base64-js: "npm:^1.5.1" + xmlbuilder: "npm:^15.1.1" + checksum: 10/ab9350226a2f651c030f9704a0c66474b616b9772e7c6209d2d8271a6e5cc5d713b3b755c2c790a3b96d6f29af35b5ef18353611dc9e6f58d1827b207036ec81 + languageName: node + linkType: hard + +"@expo/prebuild-config@npm:^54.0.8": + version: 54.0.8 + resolution: "@expo/prebuild-config@npm:54.0.8" + dependencies: + "@expo/config": "npm:~12.0.13" + "@expo/config-plugins": "npm:~54.0.4" + "@expo/config-types": "npm:^54.0.10" + "@expo/image-utils": "npm:^0.8.8" + "@expo/json-file": "npm:^10.0.8" + "@react-native/normalize-colors": "npm:0.81.5" debug: "npm:^4.3.1" resolve-from: "npm:^5.0.0" semver: "npm:^7.6.0" xml2js: "npm:0.6.0" - checksum: 10/7b31e0b7499c4df314d21ceec3e4effff01826616b823a18c8cabfded4a52659a842650e8da75ec289e09a71877b839e448f62eaf375dcd6baaad78e1534eca8 + peerDependencies: + expo: "*" + checksum: 10/67f0fd1ad9332ff10c554e4b31602656daf222f2c51cebde9c024cb47b7ea13653ee1b01a00b6ea7cdf8fe8c99e20955788de9dec578c394e6b2357ef5919ab9 + languageName: node + linkType: hard + +"@expo/require-utils@npm:^55.0.2": + version: 55.0.2 + resolution: "@expo/require-utils@npm:55.0.2" + dependencies: + "@babel/code-frame": "npm:^7.20.0" + "@babel/core": "npm:^7.25.2" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" + peerDependencies: + typescript: ^5.0.0 || ^5.0.0-0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/19c7c82a46c23e03478203c828d99e9c31ae6328eca5683aabd54fe2fe51097e10aaeb02a64cfe527f0ca20694fac3cc94e7b81a314e114eada14df0ad29e323 + languageName: node + linkType: hard + +"@expo/schema-utils@npm:^0.1.8": + version: 0.1.8 + resolution: "@expo/schema-utils@npm:0.1.8" + checksum: 10/72c02dcd107da08bd0df829b57edca77e48d9e3386304510a043c8d19892d20ec230ccdb27f5b2e08b3576046b3bfe66afdaf1e071c6a0296fa3817dbaa49932 languageName: node linkType: hard @@ -2294,14 +2371,14 @@ __metadata: languageName: node linkType: hard -"@expo/vector-icons@npm:^14.0.0": - version: 14.1.0 - resolution: "@expo/vector-icons@npm:14.1.0" +"@expo/vector-icons@npm:^15.0.3": + version: 15.1.1 + resolution: "@expo/vector-icons@npm:15.1.1" peerDependencies: - expo-font: "*" + expo-font: ">=14.0.4" react: "*" react-native: "*" - checksum: 10/5b80a684042672e40f311a921fca7acc964fdddb1edd2c2c22253f5b9097e9fe441626ffa50c98ffc2622a3f1a9b5315a8a73796348d3b03108b4da2600384bc + checksum: 10/204fafd5141c81bd55dd33f6c00cdc48ec1d37b6460be6fa3f851ccb235e1fad1097f22d034470daa49a5b839d058bbcadda1efd349c670c2fdce2ae65fb9bba languageName: node linkType: hard @@ -3406,13 +3483,13 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.79.6": - version: 0.79.6 - resolution: "@react-native/babel-plugin-codegen@npm:0.79.6" +"@react-native/babel-plugin-codegen@npm:0.81.5": + version: 0.81.5 + resolution: "@react-native/babel-plugin-codegen@npm:0.81.5" dependencies: "@babel/traverse": "npm:^7.25.3" - "@react-native/codegen": "npm:0.79.6" - checksum: 10/80ee3ef484d1d98fee0fdf6a770008767d883b2a5cf77628a664095c0aa15ad10380cc227c33dd474c39dc283b4aef5953a0c8079b2caa923c946c6978d0d27b + "@react-native/codegen": "npm:0.81.5" + checksum: 10/e8a4bb4c0d6f79e1162aeadb45e0495cb7515f75adda35de77c2b21be345b0e0e45ff7c4710a0ea285b9a42a8354ac66995f7bb5e7fbb144dbff3c67e1b6c9c7 languageName: node linkType: hard @@ -3426,6 +3503,16 @@ __metadata: languageName: node linkType: hard +"@react-native/babel-plugin-codegen@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/babel-plugin-codegen@npm:0.83.2" + dependencies: + "@babel/traverse": "npm:^7.25.3" + "@react-native/codegen": "npm:0.83.2" + checksum: 10/fa28a674da9d4c515ccde850858bd27b1b508825f02bd415f4e48f8e2f0becf41a6d2f96e8578e0670d50dc1b36d2fe7403194c0f52d31bf87728982a13399d1 + languageName: node + linkType: hard + "@react-native/babel-plugin-codegen@npm:0.84.1": version: 0.84.1 resolution: "@react-native/babel-plugin-codegen@npm:0.84.1" @@ -3436,9 +3523,9 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-preset@npm:0.79.6": - version: 0.79.6 - resolution: "@react-native/babel-preset@npm:0.79.6" +"@react-native/babel-preset@npm:0.81.5": + version: 0.81.5 + resolution: "@react-native/babel-preset@npm:0.81.5" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" @@ -3481,13 +3568,13 @@ __metadata: "@babel/plugin-transform-typescript": "npm:^7.25.2" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" "@babel/template": "npm:^7.25.0" - "@react-native/babel-plugin-codegen": "npm:0.79.6" - babel-plugin-syntax-hermes-parser: "npm:0.25.1" + "@react-native/babel-plugin-codegen": "npm:0.81.5" + babel-plugin-syntax-hermes-parser: "npm:0.29.1" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/dd9d69cf68ee2e52d4c1c3d23ff69087b86a6daf885f83bef220cb881512868e9eee1920571de43d3844757b23b0ca8b3459f38bee8c71c58b6d6029bc31483f + checksum: 10/c077e01b093be9f93e08b36dd7bc425d897749f76f9a2912cff8589f9ad3e36be0d6b54542ec6fbf13bd4b87ff7648b17a275930c546665d7b8accf4c89b6ff3 languageName: node linkType: hard @@ -3546,6 +3633,61 @@ __metadata: languageName: node linkType: hard +"@react-native/babel-preset@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/babel-preset@npm:0.83.2" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/plugin-syntax-export-default-from": "npm:^7.24.7" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.25.4" + "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" + "@babel/plugin-transform-block-scoping": "npm:^7.25.0" + "@babel/plugin-transform-class-properties": "npm:^7.25.4" + "@babel/plugin-transform-classes": "npm:^7.25.4" + "@babel/plugin-transform-computed-properties": "npm:^7.24.7" + "@babel/plugin-transform-destructuring": "npm:^7.24.8" + "@babel/plugin-transform-flow-strip-types": "npm:^7.25.2" + "@babel/plugin-transform-for-of": "npm:^7.24.7" + "@babel/plugin-transform-function-name": "npm:^7.25.1" + "@babel/plugin-transform-literals": "npm:^7.25.2" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" + "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" + "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/plugin-transform-private-methods": "npm:^7.24.7" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" + "@babel/plugin-transform-react-display-name": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx": "npm:^7.25.2" + "@babel/plugin-transform-react-jsx-self": "npm:^7.24.7" + "@babel/plugin-transform-react-jsx-source": "npm:^7.24.7" + "@babel/plugin-transform-regenerator": "npm:^7.24.7" + "@babel/plugin-transform-runtime": "npm:^7.24.7" + "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" + "@babel/plugin-transform-spread": "npm:^7.24.7" + "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" + "@babel/plugin-transform-typescript": "npm:^7.25.2" + "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" + "@babel/template": "npm:^7.25.0" + "@react-native/babel-plugin-codegen": "npm:0.83.2" + babel-plugin-syntax-hermes-parser: "npm:0.32.0" + babel-plugin-transform-flow-enums: "npm:^0.0.2" + react-refresh: "npm:^0.14.0" + peerDependencies: + "@babel/core": "*" + checksum: 10/e35d3bd86caaf49abc2703d43319aa68195f8f9c48b42f8dc70ead5127b41178bda5d6a39c64f39c12a3b1eeafc1ddd4746e2d108fec1619adcc0d664702e7d5 + languageName: node + linkType: hard + "@react-native/babel-preset@npm:0.84.1": version: 0.84.1 resolution: "@react-native/babel-preset@npm:0.84.1" @@ -3589,20 +3731,20 @@ __metadata: languageName: node linkType: hard -"@react-native/codegen@npm:0.79.6": - version: 0.79.6 - resolution: "@react-native/codegen@npm:0.79.6" +"@react-native/codegen@npm:0.81.5": + version: 0.81.5 + resolution: "@react-native/codegen@npm:0.81.5" dependencies: "@babel/core": "npm:^7.25.2" "@babel/parser": "npm:^7.25.3" glob: "npm:^7.1.1" - hermes-parser: "npm:0.25.1" + hermes-parser: "npm:0.29.1" invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" yargs: "npm:^17.6.2" peerDependencies: "@babel/core": "*" - checksum: 10/24c4461d6d9b8db1fc540e074d8948f487e710e86903344f9fab0a39f1ddcdab2b674c88adb82c95cfd3c41f5ae5b8703713aca5c1037d3297a3178cb400fe84 + checksum: 10/eb162a2b4232e6b6a345a659688c488610ba918e40dc8e4a9d17ed4fd3e026ca8066825128533ea5955b0eb58b3af0f8beb813f188bc506d8989285572f5d34f languageName: node linkType: hard @@ -3623,6 +3765,23 @@ __metadata: languageName: node linkType: hard +"@react-native/codegen@npm:0.83.2": + version: 0.83.2 + resolution: "@react-native/codegen@npm:0.83.2" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/parser": "npm:^7.25.3" + glob: "npm:^7.1.1" + hermes-parser: "npm:0.32.0" + invariant: "npm:^2.2.4" + nullthrows: "npm:^1.1.1" + yargs: "npm:^17.6.2" + peerDependencies: + "@babel/core": "*" + checksum: 10/757095d1b7b20574012751bd647242bb2e5b67b14afb6c5a2b80e51bb36e474aaf34c6c6600cc09b23745bc38469dab99ec56c53f7a8737ca1ec4b9aa52fbdde + languageName: node + linkType: hard + "@react-native/codegen@npm:0.84.1": version: 0.84.1 resolution: "@react-native/codegen@npm:0.84.1" @@ -3663,10 +3822,10 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.79.4": - version: 0.79.4 - resolution: "@react-native/debugger-frontend@npm:0.79.4" - checksum: 10/c618bfd5c498bc05fb9f8cc8f07d449dd19a3d4ac7264d537795f80e691a61a3b4ebc86434ed40240f32f09954765635ae028e42a348b963faaa258634fdff97 +"@react-native/debugger-frontend@npm:0.81.5": + version: 0.81.5 + resolution: "@react-native/debugger-frontend@npm:0.81.5" + checksum: 10/a5d6e908129f8d6efe5a02251d4f64de677b9a6719b8351b57f0c2a8c40b04d923e7f5b08351c2f4968d88ce3f6fbaa94c3f5603cb10b8285c447f0ed93228fe languageName: node linkType: hard @@ -3688,22 +3847,22 @@ __metadata: languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.79.4": - version: 0.79.4 - resolution: "@react-native/dev-middleware@npm:0.79.4" +"@react-native/dev-middleware@npm:0.81.5": + version: 0.81.5 + resolution: "@react-native/dev-middleware@npm:0.81.5" dependencies: "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.79.4" + "@react-native/debugger-frontend": "npm:0.81.5" chrome-launcher: "npm:^0.15.2" chromium-edge-launcher: "npm:^0.2.0" connect: "npm:^3.6.5" - debug: "npm:^2.2.0" + debug: "npm:^4.4.0" invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" open: "npm:^7.0.3" serve-static: "npm:^1.16.2" ws: "npm:^6.2.3" - checksum: 10/a1ee004f8883705d1c33e3f1f6da68ff0706da9308b29d633e52a0ac1cc5cb4f530fd25e31bcd0d2204c65ec9e70d615aad7c3e2e656c22a1f3ea5d7fcf42d91 + checksum: 10/bd65d55b98c8d28e5e4163873f496add4e67b87f3a350b57cfe4b110f217a40d0bf4207b57a4b32a4d275b5b4661f1e1fb915a76c5cbc93ab316fe37ab49503a languageName: node linkType: hard @@ -3841,10 +4000,10 @@ __metadata: languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.79.6": - version: 0.79.6 - resolution: "@react-native/normalize-colors@npm:0.79.6" - checksum: 10/e8596238ddf6f666cb336cd410616f2222f513022ea37fd908826161cf554d00c5d43eb8b50e8a2f7000b9f73ee99c37e9813261cad4b896f7a74f26aaed0ebe +"@react-native/normalize-colors@npm:0.81.5": + version: 0.81.5 + resolution: "@react-native/normalize-colors@npm:0.81.5" + checksum: 10/9a703b228b0e694436385f4438a684599f3b4f1ea16e3eb06f02b3bc2f9e091e3a754b4d25f0ad43ed7169ef5658603b30d0d78ee6bef338939313f16d85f077 languageName: node linkType: hard @@ -4069,7 +4228,7 @@ __metadata: languageName: node linkType: hard -"@testing-library/react-native@npm:^13.1.0": +"@testing-library/react-native@npm:^13.2.0": version: 13.3.3 resolution: "@testing-library/react-native@npm:13.3.3" dependencies: @@ -4433,6 +4592,13 @@ __metadata: languageName: node linkType: hard +"@ungap/structured-clone@npm:^1.3.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10/80d6910946f2b1552a2406650051c91bbd1f24a6bf854354203d84fe2714b3e8ce4618f49cc3410494173a1c1e8e9777372fe68dce74bd45faf0a7a1a6ccf448 + languageName: node + linkType: hard + "@urql/core@npm:^5.0.6, @urql/core@npm:^5.1.2": version: 5.2.0 resolution: "@urql/core@npm:5.2.0" @@ -4504,7 +4670,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:^1.3.8, accepts@npm:~1.3.8": +"accepts@npm:^1.3.7, accepts@npm:^1.3.8, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -5054,19 +5220,28 @@ __metadata: languageName: node linkType: hard -"babel-plugin-react-native-web@npm:~0.19.13": - version: 0.19.13 - resolution: "babel-plugin-react-native-web@npm:0.19.13" - checksum: 10/05ef14f7ffad194a80f27624d52d6f661e5956e606a41aefd34220016357068b6dead23f5c80671345f4e5878dd6ed5cb3a567aef128e38570780458a141d07a +"babel-plugin-react-compiler@npm:^1.0.0": + version: 1.0.0 + resolution: "babel-plugin-react-compiler@npm:1.0.0" + dependencies: + "@babel/types": "npm:^7.26.0" + checksum: 10/51358f4da7dd338afd93ca647af3b5b95fdedd2ffde78719fbba5c542e3d66d338f020bc61234caf4ddf25cddbf517ae101ff76e362e3244d1047c1e64d90a60 languageName: node linkType: hard -"babel-plugin-syntax-hermes-parser@npm:0.25.1, babel-plugin-syntax-hermes-parser@npm:^0.25.1": - version: 0.25.1 - resolution: "babel-plugin-syntax-hermes-parser@npm:0.25.1" +"babel-plugin-react-native-web@npm:~0.21.0": + version: 0.21.2 + resolution: "babel-plugin-react-native-web@npm:0.21.2" + checksum: 10/511fe25e4fc76ac68e6edd3177676251c65e96b3e516805c21d4106bf998439dba5a96f80981a3dda39d2c09b95dc9dd62852fc465b433b2831657f8fd376eaf + languageName: node + linkType: hard + +"babel-plugin-syntax-hermes-parser@npm:0.29.1, babel-plugin-syntax-hermes-parser@npm:^0.29.1": + version: 0.29.1 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.29.1" dependencies: - hermes-parser: "npm:0.25.1" - checksum: 10/dc80fafde1aed8e60cf86ecd2e9920e7f35ffe02b33bd4e772daaa786167bcf508aac3fc1aea425ff4c7a0be94d82528f3fe8619b7f41dac853264272d640c04 + hermes-parser: "npm:0.29.1" + checksum: 10/bbb1eed253b4255f8c572e1cb2664868d9aa2238363e48a2d1e95e952b2c1d59e86a7051f44956407484df2c9bc6623608740eec10e2095946d241b795262cec languageName: node linkType: hard @@ -5088,6 +5263,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-hermes-parser@npm:^0.32.0": + version: 0.32.1 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.32.1" + dependencies: + hermes-parser: "npm:0.32.1" + checksum: 10/b8b6c4d2ffa2cf0c6835c58693899023da86dd42a785355c0d005abda5a857cb701fd7b879ccbebafdc146ebfa635aeb4650dd69dc245f21f1378060ebfde9ed + languageName: node + linkType: hard + "babel-plugin-transform-flow-enums@npm:^0.0.2": version: 0.0.2 resolution: "babel-plugin-transform-flow-enums@npm:0.0.2" @@ -5122,14 +5306,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-expo@npm:~13.2.1": - version: 13.2.5 - resolution: "babel-preset-expo@npm:13.2.5" +"babel-preset-expo@npm:~54.0.10": + version: 54.0.10 + resolution: "babel-preset-expo@npm:54.0.10" dependencies: "@babel/helper-module-imports": "npm:^7.25.9" "@babel/plugin-proposal-decorators": "npm:^7.12.9" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" "@babel/plugin-syntax-export-default-from": "npm:^7.24.7" + "@babel/plugin-transform-class-static-block": "npm:^7.27.1" "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" "@babel/plugin-transform-flow-strip-types": "npm:^7.25.2" "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" @@ -5140,19 +5325,66 @@ __metadata: "@babel/plugin-transform-runtime": "npm:^7.24.7" "@babel/preset-react": "npm:^7.22.15" "@babel/preset-typescript": "npm:^7.23.0" - "@react-native/babel-preset": "npm:0.79.6" - babel-plugin-react-native-web: "npm:~0.19.13" - babel-plugin-syntax-hermes-parser: "npm:^0.25.1" + "@react-native/babel-preset": "npm:0.81.5" + babel-plugin-react-compiler: "npm:^1.0.0" + babel-plugin-react-native-web: "npm:~0.21.0" + babel-plugin-syntax-hermes-parser: "npm:^0.29.1" + babel-plugin-transform-flow-enums: "npm:^0.0.2" + debug: "npm:^4.3.4" + resolve-from: "npm:^5.0.0" + peerDependencies: + "@babel/runtime": ^7.20.0 + expo: "*" + react-refresh: ">=0.14.0 <1.0.0" + peerDependenciesMeta: + "@babel/runtime": + optional: true + expo: + optional: true + checksum: 10/210493e87fb2566fbf774a2bf20a0cfd552eb83f7d3fb71aa4b576ebeed6d367a1d7eda64cec8d166859efde6594789946676bae0d26176a45e4be9fac2fd6a4 + languageName: node + linkType: hard + +"babel-preset-expo@npm:~55.0.1": + version: 55.0.11 + resolution: "babel-preset-expo@npm:55.0.11" + dependencies: + "@babel/generator": "npm:^7.20.5" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/plugin-proposal-decorators": "npm:^7.12.9" + "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" + "@babel/plugin-syntax-export-default-from": "npm:^7.24.7" + "@babel/plugin-transform-class-static-block": "npm:^7.27.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" + "@babel/plugin-transform-flow-strip-types": "npm:^7.25.2" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" + "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" + "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/plugin-transform-private-methods": "npm:^7.24.7" + "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" + "@babel/plugin-transform-runtime": "npm:^7.24.7" + "@babel/preset-react": "npm:^7.22.15" + "@babel/preset-typescript": "npm:^7.23.0" + "@react-native/babel-preset": "npm:0.83.2" + babel-plugin-react-compiler: "npm:^1.0.0" + babel-plugin-react-native-web: "npm:~0.21.0" + babel-plugin-syntax-hermes-parser: "npm:^0.32.0" babel-plugin-transform-flow-enums: "npm:^0.0.2" debug: "npm:^4.3.4" - react-refresh: "npm:^0.14.2" resolve-from: "npm:^5.0.0" peerDependencies: - babel-plugin-react-compiler: ^19.0.0-beta-e993439-20250405 + "@babel/runtime": ^7.20.0 + expo: "*" + expo-widgets: ^55.0.4 + react-refresh: ">=0.14.0 <1.0.0" peerDependenciesMeta: - babel-plugin-react-compiler: + "@babel/runtime": + optional: true + expo: optional: true - checksum: 10/890b61cb96159600bf19f154380c69c2571c2df8c74c82e16febc75def997250179fb4cc52fcb31d162a974676fa29664a0bb30c1a89290783de767bb98e26a3 + expo-widgets: + optional: true + checksum: 10/4fd4ef180038f5d3a39003424bd4cbc9ddadeede87f3930a3b342f8d4d0202cd79899faa48c4445ed3a2f79a576cb0807a51c930df73ddb9a30cc68e3b0c26ab languageName: node linkType: hard @@ -5330,7 +5562,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.28.1": +"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.25.0, browserslist@npm:^4.28.1": version: 4.28.1 resolution: "browserslist@npm:4.28.1" dependencies: @@ -6178,13 +6410,6 @@ __metadata: languageName: node linkType: hard -"crypto-random-string@npm:^2.0.0": - version: 2.0.0 - resolution: "crypto-random-string@npm:2.0.0" - checksum: 10/0283879f55e7c16fdceacc181f87a0a65c53bc16ffe1d58b9d19a6277adcd71900d02bb2c4843dd55e78c51e30e89b0fec618a7f170ebcc95b33182c28f05fd6 - languageName: node - linkType: hard - "cssom@npm:^0.5.0": version: 0.5.0 resolution: "cssom@npm:0.5.0" @@ -6280,7 +6505,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.9": +"debug@npm:2.6.9, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -6523,12 +6748,10 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^1.0.3": - version: 1.0.3 - resolution: "detect-libc@npm:1.0.3" - bin: - detect-libc: ./bin/detect-libc.js - checksum: 10/3849fe7720feb153e4ac9407086956e073f1ce1704488290ef0ca8aab9430a8d48c8a9f8351889e7cdc64e5b1128589501e4fef48f3a4a49ba92cd6d112d0757 +"detect-libc@npm:^2.0.3": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10/b736c8d97d5d46164c0d1bed53eb4e6a3b1d8530d460211e2d52f1c552875e706c58a5376854e4e54f8b828c9cada58c855288c968522eb93ac7696d65970766 languageName: node linkType: hard @@ -7550,140 +7773,154 @@ __metadata: languageName: node linkType: hard -"expo-asset@npm:~11.1.5": - version: 11.1.7 - resolution: "expo-asset@npm:11.1.7" +"expo-asset@npm:~12.0.12": + version: 12.0.12 + resolution: "expo-asset@npm:12.0.12" dependencies: - "@expo/image-utils": "npm:^0.7.6" - expo-constants: "npm:~17.1.7" + "@expo/image-utils": "npm:^0.8.8" + expo-constants: "npm:~18.0.12" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10/c7851f3cf69ad2d8075908f719baf3a96660f262109374a563418912b7588a126f425225bc2126eca005873aa719c4683b99a467984e244d1931e6f1ba68655a + checksum: 10/7034316d820837c92ac70274be56a8e59181f1513805f8a4c85e16f12e1dd75ac6d6ae0b231bd8a76adbb71be6163c05b31b1d437f15b14745c70cc1f255c8a1 languageName: node linkType: hard -"expo-constants@npm:~17.1.6, expo-constants@npm:~17.1.7": - version: 17.1.8 - resolution: "expo-constants@npm:17.1.8" +"expo-constants@npm:~18.0.12, expo-constants@npm:~18.0.13": + version: 18.0.13 + resolution: "expo-constants@npm:18.0.13" dependencies: - "@expo/config": "npm:~11.0.13" - "@expo/env": "npm:~1.0.7" + "@expo/config": "npm:~12.0.13" + "@expo/env": "npm:~2.0.8" peerDependencies: expo: "*" react-native: "*" - checksum: 10/f0246ea710e26dadaf490412ad8285cca158ae26e3c402f21d6ac5126b203da2e7b0e7eb0063084d9f8930476f5baa8f83133bfd7d2c854f24050dbe0e6fc90a + checksum: 10/f29c72b6f5798bd37550aafcc89c3f1a630c4910a5b69c1e19d03544f6ebf0cb65adf39db600ccbeb6e60545b2b231d244373ef3139e3c75991b380940065c6b languageName: node linkType: hard -"expo-file-system@npm:~18.1.10": - version: 18.1.11 - resolution: "expo-file-system@npm:18.1.11" +"expo-file-system@npm:~19.0.21": + version: 19.0.21 + resolution: "expo-file-system@npm:19.0.21" peerDependencies: expo: "*" react-native: "*" - checksum: 10/8a2f1d87bb0aec96b4f7f3559e7c5ff7bf6a9df394fae3ddbfa89a40e6e4de5c06b9e6cc1b0065ab886f08665b5ebcad4a0105e5f2b1ef8c1a66b7ce8845cbf7 + checksum: 10/00a2f13f8139724016f8b811303dd4a4070a315f80ee9e1877bcfd00773b38caafe4f1d3d7d4a87777e4ff53ba645aae0b4430e875f9ee5f277b88372b507811 languageName: node linkType: hard -"expo-font@npm:~13.3.1": - version: 13.3.2 - resolution: "expo-font@npm:13.3.2" +"expo-font@npm:~14.0.11": + version: 14.0.11 + resolution: "expo-font@npm:14.0.11" dependencies: fontfaceobserver: "npm:^2.1.0" peerDependencies: expo: "*" react: "*" - checksum: 10/ac3de637e226c5a68049b55e1f90989fae80464f4f5919609a729a9296d79fa294f7b8774fd46b466855882a5133a3badb576957735d4c637f6fffa7720db9ce + react-native: "*" + checksum: 10/80acffecdbd49a2ba1d7ecd8727f355bf47c39873d92f5959ff3bf7fd1de3e6ac10ebe2a77b8238287c3f2b7d033df40b562505fec370f82d9444400e19d7518 languageName: node linkType: hard -"expo-keep-awake@npm:~14.1.4": - version: 14.1.4 - resolution: "expo-keep-awake@npm:14.1.4" +"expo-keep-awake@npm:~15.0.8": + version: 15.0.8 + resolution: "expo-keep-awake@npm:15.0.8" peerDependencies: expo: "*" react: "*" - checksum: 10/d90781fa940f2cac235608e87f52ab4922bf3b3be0b827dc17a2e33a93daad5471445abbe338f76e38561cec2841cbf50e5b78183a0c4819d2462e81e40c6f69 + checksum: 10/d15c4ec6f033ed89db55c3c4d338db0e012dba10c471d3cca7978e38036e1c4e44c5a4970fa0d87e64c7f1d78c1320910331485bc5caf53acbbfd6277b414353 languageName: node linkType: hard -"expo-module-scripts@npm:4.1.8": - version: 4.1.8 - resolution: "expo-module-scripts@npm:4.1.8" +"expo-module-scripts@npm:55.0.2": + version: 55.0.2 + resolution: "expo-module-scripts@npm:55.0.2" dependencies: "@babel/cli": "npm:^7.23.4" "@babel/plugin-transform-export-namespace-from": "npm:^7.23.4" "@babel/preset-env": "npm:^7.23.8" "@babel/preset-typescript": "npm:^7.23.3" "@expo/npm-proofread": "npm:^1.0.1" - "@testing-library/react-native": "npm:^13.1.0" + "@expo/spawn-async": "npm:^1.7.2" + "@testing-library/react-native": "npm:^13.2.0" "@tsconfig/node18": "npm:^18.2.2" "@types/jest": "npm:^29.2.1" babel-plugin-dynamic-import-node: "npm:^2.3.3" - babel-preset-expo: "npm:~13.2.1" + babel-preset-expo: "npm:~55.0.1" commander: "npm:^12.1.0" eslint-config-universe: "npm:^15.0.3" - glob: "npm:^10.4.2" - jest-expo: "npm:~53.0.7" + glob: "npm:^13.0.0" + jest-expo: "npm:~55.0.3" jest-snapshot-prettier: "npm:prettier@^2" jest-watch-typeahead: "npm:2.2.1" resolve-workspace-root: "npm:^2.0.0" ts-jest: "npm:~29.0.4" - typescript: "npm:^5.8.3" + typescript: "npm:^5.9.2" bin: expo-module: bin/expo-module.js - checksum: 10/b870345ca2a72a721494f50b433e1ad1144128fd482dcd221a98d5af7f7140579424bf30805e8ad46352a598f830d179b0e980c2a91295277f344d9cf39827ae + checksum: 10/1fe105ee04476c8bc759a084516ae0857a44b2d4e8ea799c41ab308c2df9391737687209790f66d2fe0890568a24c7dbc710371a9e7489009cb854c9676ff485 languageName: node linkType: hard -"expo-modules-autolinking@npm:2.1.12": - version: 2.1.12 - resolution: "expo-modules-autolinking@npm:2.1.12" +"expo-modules-autolinking@npm:3.0.24": + version: 3.0.24 + resolution: "expo-modules-autolinking@npm:3.0.24" dependencies: "@expo/spawn-async": "npm:^1.7.2" chalk: "npm:^4.1.0" commander: "npm:^7.2.0" - find-up: "npm:^5.0.0" - glob: "npm:^10.4.2" require-from-string: "npm:^2.0.2" resolve-from: "npm:^5.0.0" bin: expo-modules-autolinking: bin/expo-modules-autolinking.js - checksum: 10/6ea93ab4e1577f81b4cf7322cc4c9328b0f0b94498a4ffdd2c8fc948e9283375452e3322e50427fa85fdd6f4dcb4c15d30f295d2402b0c2ce6bbb6d3a5519dd8 + checksum: 10/e3b77d2fa84b77e53dca2ef608b48c4db196957c76ac7cc1aba4eb2cca44b5082a16f7af8a3549a342c7a1362f069a76fb9ebdab4be6b467e3791ad48387e15a languageName: node linkType: hard -"expo-modules-core@npm:2.4.0": - version: 2.4.0 - resolution: "expo-modules-core@npm:2.4.0" +"expo-modules-core@npm:3.0.29": + version: 3.0.29 + resolution: "expo-modules-core@npm:3.0.29" dependencies: invariant: "npm:^2.2.4" - checksum: 10/f0ae08520b41dc6c6a526e641796ce2257f7cf81dc30d0dec74b7612373f3e00b73682bb04686cff211cb407fdfe2fb77f6befd537d2dfd32f1cd5eff4c31d41 + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/db23a1c7321db54f40f0bcb9c18e7239d798fb7fb5d8ceedf09879f7ff4d90a85e375851796008006441326ed61c00ba00950b06bc7ea74f6ba648a9dac9d053 languageName: node linkType: hard -"expo@npm:53.0.13": - version: 53.0.13 - resolution: "expo@npm:53.0.13" +"expo-server@npm:^1.0.5": + version: 1.0.5 + resolution: "expo-server@npm:1.0.5" + checksum: 10/42cda83d5b514061d4142118fa8590ff8b55218b91a7e6ac131ed71ca743301f7aae7fe6954d96671b6251959b08fe8119eb2f18500b4b5e07ea0c127d2d72c7 + languageName: node + linkType: hard + +"expo@npm:^54.0.0": + version: 54.0.33 + resolution: "expo@npm:54.0.33" dependencies: "@babel/runtime": "npm:^7.20.0" - "@expo/cli": "npm:0.24.15" - "@expo/config": "npm:~11.0.10" - "@expo/config-plugins": "npm:~10.0.3" - "@expo/fingerprint": "npm:0.13.1" - "@expo/metro-config": "npm:0.20.15" - "@expo/vector-icons": "npm:^14.0.0" - babel-preset-expo: "npm:~13.2.1" - expo-asset: "npm:~11.1.5" - expo-constants: "npm:~17.1.6" - expo-file-system: "npm:~18.1.10" - expo-font: "npm:~13.3.1" - expo-keep-awake: "npm:~14.1.4" - expo-modules-autolinking: "npm:2.1.12" - expo-modules-core: "npm:2.4.0" - react-native-edge-to-edge: "npm:1.6.0" + "@expo/cli": "npm:54.0.23" + "@expo/config": "npm:~12.0.13" + "@expo/config-plugins": "npm:~54.0.4" + "@expo/devtools": "npm:0.1.8" + "@expo/fingerprint": "npm:0.15.4" + "@expo/metro": "npm:~54.2.0" + "@expo/metro-config": "npm:54.0.14" + "@expo/vector-icons": "npm:^15.0.3" + "@ungap/structured-clone": "npm:^1.3.0" + babel-preset-expo: "npm:~54.0.10" + expo-asset: "npm:~12.0.12" + expo-constants: "npm:~18.0.13" + expo-file-system: "npm:~19.0.21" + expo-font: "npm:~14.0.11" + expo-keep-awake: "npm:~15.0.8" + expo-modules-autolinking: "npm:3.0.24" + expo-modules-core: "npm:3.0.29" + pretty-format: "npm:^29.7.0" + react-refresh: "npm:^0.14.2" whatwg-url-without-unicode: "npm:8.0.0-3" peerDependencies: "@expo/dom-webview": "*" @@ -7702,7 +7939,7 @@ __metadata: expo: bin/cli expo-modules-autolinking: bin/autolinking fingerprint: bin/fingerprint - checksum: 10/bab634556e25bf32684914a077ca635005b3655f998d65434585799354ef713a6978ac117f2f36e8ae6811b2d06f58f898731d2f622860d4223e5d07570b75d5 + checksum: 10/ed672f78333cf50545ea1cca8181506604150cca01a8aae782da30ddcba185d68f2d48f2ca10dee575a7abbc7913cca3f4c3d34d98373b0e9706b344030fa929 languageName: node linkType: hard @@ -8283,7 +8520,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.3.10, glob@npm:^10.4.2, glob@npm:^10.5.0": +"glob@npm:^10.5.0": version: 10.5.0 resolution: "glob@npm:10.5.0" dependencies: @@ -8516,6 +8753,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.29.1": + version: 0.29.1 + resolution: "hermes-estree@npm:0.29.1" + checksum: 10/8989fc224fcd2bb3356d7d330461c9f32303904824891ae4befafc08f13c871013b18d5d4cd4b20bf6f59e9d26afdbb10d33440c6e646de770db4b9543c39db4 + languageName: node + linkType: hard + "hermes-estree@npm:0.32.0": version: 0.32.0 resolution: "hermes-estree@npm:0.32.0" @@ -8523,6 +8767,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.32.1": + version: 0.32.1 + resolution: "hermes-estree@npm:0.32.1" + checksum: 10/6d0c03216c69fcabe6a534ffcffd4bc21b54de1e7ae3c81f1cafce36c33c4acafe334ee27e865f65549b78971dbdb3d78be9b40281365a162c6a23a6b8f1e06b + languageName: node + linkType: hard + "hermes-estree@npm:0.33.3": version: 0.33.3 resolution: "hermes-estree@npm:0.33.3" @@ -8530,15 +8781,6 @@ __metadata: languageName: node linkType: hard -"hermes-parser@npm:0.25.1, hermes-parser@npm:^0.25.1": - version: 0.25.1 - resolution: "hermes-parser@npm:0.25.1" - dependencies: - hermes-estree: "npm:0.25.1" - checksum: 10/805efc05691420f236654349872c70731121791fa54de521c7ee51059eae34f84dd19f22ee846741dcb60372f8fb5335719b96b4ecb010d2aed7d872f2eff9cc - languageName: node - linkType: hard - "hermes-parser@npm:0.28.1": version: 0.28.1 resolution: "hermes-parser@npm:0.28.1" @@ -8548,6 +8790,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.29.1, hermes-parser@npm:^0.29.1": + version: 0.29.1 + resolution: "hermes-parser@npm:0.29.1" + dependencies: + hermes-estree: "npm:0.29.1" + checksum: 10/2d1ada9d48817668bf12b31deef7c5a4a7d88419448c7e07ad67197a7992462dea3f5e536aea2c6f7e2222940f96bb7cd7a7dc5a101c9b4b2d7a84e1a1272670 + languageName: node + linkType: hard + "hermes-parser@npm:0.32.0": version: 0.32.0 resolution: "hermes-parser@npm:0.32.0" @@ -8557,6 +8808,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.32.1": + version: 0.32.1 + resolution: "hermes-parser@npm:0.32.1" + dependencies: + hermes-estree: "npm:0.32.1" + checksum: 10/f392d309e3e9d01a01fd71bda83a488906b1182ebf4073768a6528b28c7a1b54f099a4170593dcfad886c434927dbedf93eff985ec6cf78af4c6eded10e26f03 + languageName: node + linkType: hard + "hermes-parser@npm:0.33.3": version: 0.33.3 resolution: "hermes-parser@npm:0.33.3" @@ -8566,6 +8826,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:^0.25.1": + version: 0.25.1 + resolution: "hermes-parser@npm:0.25.1" + dependencies: + hermes-estree: "npm:0.25.1" + checksum: 10/805efc05691420f236654349872c70731121791fa54de521c7ee51059eae34f84dd19f22ee846741dcb60372f8fb5335719b96b4ecb010d2aed7d872f2eff9cc + languageName: node + linkType: hard + "hosted-git-info@npm:^7.0.0": version: 7.0.2 resolution: "hosted-git-info@npm:7.0.2" @@ -9669,23 +9938,22 @@ __metadata: languageName: node linkType: hard -"jest-expo@npm:~53.0.7": - version: 53.0.14 - resolution: "jest-expo@npm:53.0.14" +"jest-expo@npm:~55.0.3": + version: 55.0.9 + resolution: "jest-expo@npm:55.0.9" dependencies: - "@expo/config": "npm:~11.0.13" - "@expo/json-file": "npm:^9.1.5" + "@expo/config": "npm:~55.0.8" + "@expo/json-file": "npm:^10.0.12" "@jest/create-cache-key-function": "npm:^29.2.1" "@jest/globals": "npm:^29.2.1" babel-jest: "npm:^29.2.1" - find-up: "npm:^5.0.0" jest-environment-jsdom: "npm:^29.2.1" jest-snapshot: "npm:^29.2.1" jest-watch-select-projects: "npm:^2.0.0" jest-watch-typeahead: "npm:2.2.1" json5: "npm:^2.2.3" lodash: "npm:^4.17.19" - react-test-renderer: "npm:19.0.0" + react-test-renderer: "npm:19.2.0" server-only: "npm:^0.0.1" stacktrace-js: "npm:^2.0.2" peerDependencies: @@ -9697,7 +9965,7 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 10/df7af5a994199cb982d8cc63877b23c479918c1478d9c32a92089ae39bb7b10781899cb37779b71c0b1b8d3d07437ee7718c5df6b2bdb42b9dfb69a206747635 + checksum: 10/de39824e49903903375d601c2bdbf66eaf89cb25d944fbd5822bcd09762d6e82198fdabdbb5d4090238a1896e2e6c496128759b503efe7d8a7dff0c16cad775c languageName: node linkType: hard @@ -10438,92 +10706,102 @@ __metadata: languageName: node linkType: hard -"lightningcss-darwin-arm64@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-darwin-arm64@npm:1.27.0" +"lightningcss-android-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-android-arm64@npm:1.32.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-arm64@npm:1.32.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"lightningcss-darwin-x64@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-darwin-x64@npm:1.27.0" +"lightningcss-darwin-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-x64@npm:1.32.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"lightningcss-freebsd-x64@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-freebsd-x64@npm:1.27.0" +"lightningcss-freebsd-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-freebsd-x64@npm:1.32.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"lightningcss-linux-arm-gnueabihf@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-linux-arm-gnueabihf@npm:1.27.0" +"lightningcss-linux-arm-gnueabihf@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.32.0" conditions: os=linux & cpu=arm languageName: node linkType: hard -"lightningcss-linux-arm64-gnu@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-linux-arm64-gnu@npm:1.27.0" +"lightningcss-linux-arm64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-gnu@npm:1.32.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"lightningcss-linux-arm64-musl@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-linux-arm64-musl@npm:1.27.0" +"lightningcss-linux-arm64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-musl@npm:1.32.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"lightningcss-linux-x64-gnu@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-linux-x64-gnu@npm:1.27.0" +"lightningcss-linux-x64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-gnu@npm:1.32.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"lightningcss-linux-x64-musl@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-linux-x64-musl@npm:1.27.0" +"lightningcss-linux-x64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-musl@npm:1.32.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"lightningcss-win32-arm64-msvc@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-win32-arm64-msvc@npm:1.27.0" +"lightningcss-win32-arm64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-arm64-msvc@npm:1.32.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"lightningcss-win32-x64-msvc@npm:1.27.0": - version: 1.27.0 - resolution: "lightningcss-win32-x64-msvc@npm:1.27.0" +"lightningcss-win32-x64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-x64-msvc@npm:1.32.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"lightningcss@npm:~1.27.0": - version: 1.27.0 - resolution: "lightningcss@npm:1.27.0" +"lightningcss@npm:^1.30.1": + version: 1.32.0 + resolution: "lightningcss@npm:1.32.0" dependencies: - detect-libc: "npm:^1.0.3" - lightningcss-darwin-arm64: "npm:1.27.0" - lightningcss-darwin-x64: "npm:1.27.0" - lightningcss-freebsd-x64: "npm:1.27.0" - lightningcss-linux-arm-gnueabihf: "npm:1.27.0" - lightningcss-linux-arm64-gnu: "npm:1.27.0" - lightningcss-linux-arm64-musl: "npm:1.27.0" - lightningcss-linux-x64-gnu: "npm:1.27.0" - lightningcss-linux-x64-musl: "npm:1.27.0" - lightningcss-win32-arm64-msvc: "npm:1.27.0" - lightningcss-win32-x64-msvc: "npm:1.27.0" + detect-libc: "npm:^2.0.3" + lightningcss-android-arm64: "npm:1.32.0" + lightningcss-darwin-arm64: "npm:1.32.0" + lightningcss-darwin-x64: "npm:1.32.0" + lightningcss-freebsd-x64: "npm:1.32.0" + lightningcss-linux-arm-gnueabihf: "npm:1.32.0" + lightningcss-linux-arm64-gnu: "npm:1.32.0" + lightningcss-linux-arm64-musl: "npm:1.32.0" + lightningcss-linux-x64-gnu: "npm:1.32.0" + lightningcss-linux-x64-musl: "npm:1.32.0" + lightningcss-win32-arm64-msvc: "npm:1.32.0" + lightningcss-win32-x64-msvc: "npm:1.32.0" dependenciesMeta: + lightningcss-android-arm64: + optional: true lightningcss-darwin-arm64: optional: true lightningcss-darwin-x64: @@ -10544,7 +10822,7 @@ __metadata: optional: true lightningcss-win32-x64-msvc: optional: true - checksum: 10/275a0103c7dc1dfcf8e456a0523d1719a1caff916c45229ec62cdb28a814dce12b7065b88865fb74fc03a2a658ac3361caff5c348f1646313513c125d4f27954 + checksum: 10/098e61007f0d0ec8b5c50884e33b543b551d1ff21bc7b062434b6638fd0b8596858f823b60dfc2a4aa756f3cb120ad79f2b7f4a55b1bda2c0269ab8cf476f114 languageName: node linkType: hard @@ -10901,6 +11179,18 @@ __metadata: languageName: node linkType: hard +"metro-babel-transformer@npm:0.83.3": + version: 0.83.3 + resolution: "metro-babel-transformer@npm:0.83.3" + dependencies: + "@babel/core": "npm:^7.25.2" + flow-enums-runtime: "npm:^0.0.6" + hermes-parser: "npm:0.32.0" + nullthrows: "npm:^1.1.1" + checksum: 10/dd178409d1718dae12dfffb6572ebc5bb78f1e0d7e93dce829c945957f8a686cb1b4c466c69585d7b982b3937fbea28d5c53a80691f2fc66717a0bcc800bc5b8 + languageName: node + linkType: hard + "metro-babel-transformer@npm:0.83.5": version: 0.83.5 resolution: "metro-babel-transformer@npm:0.83.5" @@ -10913,6 +11203,15 @@ __metadata: languageName: node linkType: hard +"metro-cache-key@npm:0.83.3": + version: 0.83.3 + resolution: "metro-cache-key@npm:0.83.3" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/a6f9d2bf8b810f57d330d6f8f1ebf029e1224f426c5895f73d9bc1007482684048bfc7513a855626ee7f3ae72ca46e1b08cf983aefbfa84321bb7c0cef4ba4ae + languageName: node + linkType: hard + "metro-cache-key@npm:0.83.5": version: 0.83.5 resolution: "metro-cache-key@npm:0.83.5" @@ -10922,6 +11221,18 @@ __metadata: languageName: node linkType: hard +"metro-cache@npm:0.83.3": + version: 0.83.3 + resolution: "metro-cache@npm:0.83.3" + dependencies: + exponential-backoff: "npm:^3.1.1" + flow-enums-runtime: "npm:^0.0.6" + https-proxy-agent: "npm:^7.0.5" + metro-core: "npm:0.83.3" + checksum: 10/4bc263ac92f176451710ebd330d156675e40f028be02eb9659a9b024db9897f3ad8510809d699969cb6f06dc0f06d85c38ca7162fb9a70be44510fa03270e089 + languageName: node + linkType: hard + "metro-cache@npm:0.83.5": version: 0.83.5 resolution: "metro-cache@npm:0.83.5" @@ -10934,6 +11245,22 @@ __metadata: languageName: node linkType: hard +"metro-config@npm:0.83.3": + version: 0.83.3 + resolution: "metro-config@npm:0.83.3" + dependencies: + connect: "npm:^3.6.5" + flow-enums-runtime: "npm:^0.0.6" + jest-validate: "npm:^29.7.0" + metro: "npm:0.83.3" + metro-cache: "npm:0.83.3" + metro-core: "npm:0.83.3" + metro-runtime: "npm:0.83.3" + yaml: "npm:^2.6.1" + checksum: 10/e377c375a48afc85a4d742f80a17fc178f9af7f5b007375e65bb49472ad78bc8e1f0ba4399411310ee8b856fb767bd81bd6dae19bec6ef6a44f0ece4d8457b30 + languageName: node + linkType: hard + "metro-config@npm:0.83.5, metro-config@npm:^0.83.3": version: 0.83.5 resolution: "metro-config@npm:0.83.5" @@ -10950,6 +11277,17 @@ __metadata: languageName: node linkType: hard +"metro-core@npm:0.83.3": + version: 0.83.3 + resolution: "metro-core@npm:0.83.3" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + lodash.throttle: "npm:^4.1.1" + metro-resolver: "npm:0.83.3" + checksum: 10/6ef06214faa1d727396d986f989a8150f699d73c5764c66e06e61b08017e462141a7b4c9ca63f67becee58ea1394b41aabfff441e644fc1e945c715e07c60612 + languageName: node + linkType: hard + "metro-core@npm:0.83.5, metro-core@npm:^0.83.3": version: 0.83.5 resolution: "metro-core@npm:0.83.5" @@ -10961,6 +11299,23 @@ __metadata: languageName: node linkType: hard +"metro-file-map@npm:0.83.3": + version: 0.83.3 + resolution: "metro-file-map@npm:0.83.3" + dependencies: + debug: "npm:^4.4.0" + fb-watchman: "npm:^2.0.0" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + nullthrows: "npm:^1.1.1" + walker: "npm:^1.0.7" + checksum: 10/be621b144168b6a35567d4313557596df68ee61c1b9a067fbf8272ec3db7c2d9d76849c9b8d2331716d6839c3f8e243e2b715ca2551d7ffebbd206a34c19591a + languageName: node + linkType: hard + "metro-file-map@npm:0.83.5": version: 0.83.5 resolution: "metro-file-map@npm:0.83.5" @@ -10978,6 +11333,16 @@ __metadata: languageName: node linkType: hard +"metro-minify-terser@npm:0.83.3": + version: 0.83.3 + resolution: "metro-minify-terser@npm:0.83.3" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + terser: "npm:^5.15.0" + checksum: 10/1de88b70b7c903147807baa46497491a87600594fd0868b6538bbb9d7785242cabfbe8bccf36cc2285d0e17be72445b512d00c496952a159572545f3e6bcb199 + languageName: node + linkType: hard + "metro-minify-terser@npm:0.83.5": version: 0.83.5 resolution: "metro-minify-terser@npm:0.83.5" @@ -10988,6 +11353,15 @@ __metadata: languageName: node linkType: hard +"metro-resolver@npm:0.83.3": + version: 0.83.3 + resolution: "metro-resolver@npm:0.83.3" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/a425376447505a088a365fc1fbe2753d452c0353a189f2c74833f2b30d6401de7ed90e36a927d355fa454d6c439a156eb66bcfcedfbbe8a78d313cf49acfbb4c + languageName: node + linkType: hard + "metro-resolver@npm:0.83.5": version: 0.83.5 resolution: "metro-resolver@npm:0.83.5" @@ -10997,6 +11371,16 @@ __metadata: languageName: node linkType: hard +"metro-runtime@npm:0.83.3": + version: 0.83.3 + resolution: "metro-runtime@npm:0.83.3" + dependencies: + "@babel/runtime": "npm:^7.25.0" + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/bf916759a7178e1d12e131c64ac67d6015ba35ead7a178e6efedd23f12ec65de99f450fe7da0ffb6c6edbfeb3cd186d2006b979a1c1c588377ae54f5f5d7921d + languageName: node + linkType: hard + "metro-runtime@npm:0.83.5, metro-runtime@npm:^0.83.3": version: 0.83.5 resolution: "metro-runtime@npm:0.83.5" @@ -11007,6 +11391,24 @@ __metadata: languageName: node linkType: hard +"metro-source-map@npm:0.83.3": + version: 0.83.3 + resolution: "metro-source-map@npm:0.83.3" + dependencies: + "@babel/traverse": "npm:^7.25.3" + "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3" + "@babel/types": "npm:^7.25.2" + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-symbolicate: "npm:0.83.3" + nullthrows: "npm:^1.1.1" + ob1: "npm:0.83.3" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + checksum: 10/1dcfce503628275f97dd85945ca575c71e5654fd8872b7d86449f3352cfc84ea7a59889b2aad012361245b5497e1e097db73390245952dcfb63258ba32fa90bf + languageName: node + linkType: hard + "metro-source-map@npm:0.83.5, metro-source-map@npm:^0.83.3": version: 0.83.5 resolution: "metro-source-map@npm:0.83.5" @@ -11024,6 +11426,22 @@ __metadata: languageName: node linkType: hard +"metro-symbolicate@npm:0.83.3": + version: 0.83.3 + resolution: "metro-symbolicate@npm:0.83.3" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-source-map: "npm:0.83.3" + nullthrows: "npm:^1.1.1" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + bin: + metro-symbolicate: src/index.js + checksum: 10/f3be0740655732044e92728a3bccd5f4a73ab2f9e4423ca05faee02446e9b2efd9400cc7bcd761fad9bc2a1b92855ce5b03bf13e0421a203fe179be40dcc9381 + languageName: node + linkType: hard + "metro-symbolicate@npm:0.83.5": version: 0.83.5 resolution: "metro-symbolicate@npm:0.83.5" @@ -11040,6 +11458,20 @@ __metadata: languageName: node linkType: hard +"metro-transform-plugins@npm:0.83.3": + version: 0.83.3 + resolution: "metro-transform-plugins@npm:0.83.3" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.25.0" + "@babel/template": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.3" + flow-enums-runtime: "npm:^0.0.6" + nullthrows: "npm:^1.1.1" + checksum: 10/fa7efe6ab4f2ce5f66e1cb302f71341cf7fd55319cf360a269b187d2f507cecce8db8069f92585cf43517aee63e18cf6e66dd124db95c293902ab27c68ac43b1 + languageName: node + linkType: hard + "metro-transform-plugins@npm:0.83.5": version: 0.83.5 resolution: "metro-transform-plugins@npm:0.83.5" @@ -11054,6 +11486,27 @@ __metadata: languageName: node linkType: hard +"metro-transform-worker@npm:0.83.3": + version: 0.83.3 + resolution: "metro-transform-worker@npm:0.83.3" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.25.0" + "@babel/parser": "npm:^7.25.3" + "@babel/types": "npm:^7.25.2" + flow-enums-runtime: "npm:^0.0.6" + metro: "npm:0.83.3" + metro-babel-transformer: "npm:0.83.3" + metro-cache: "npm:0.83.3" + metro-cache-key: "npm:0.83.3" + metro-minify-terser: "npm:0.83.3" + metro-source-map: "npm:0.83.3" + metro-transform-plugins: "npm:0.83.3" + nullthrows: "npm:^1.1.1" + checksum: 10/e6db9b54a9b21f4b06fc665321a7aebc6206dbac3976bda74bdf4d101dbd50f91b2e49163581ca1c27b684a4eecc2db988f0fc7aaeb200d2d947cb05d3e89f18 + languageName: node + linkType: hard + "metro-transform-worker@npm:0.83.5": version: 0.83.5 resolution: "metro-transform-worker@npm:0.83.5" @@ -11075,6 +11528,56 @@ __metadata: languageName: node linkType: hard +"metro@npm:0.83.3": + version: 0.83.3 + resolution: "metro@npm:0.83.3" + dependencies: + "@babel/code-frame": "npm:^7.24.7" + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.25.0" + "@babel/parser": "npm:^7.25.3" + "@babel/template": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.3" + "@babel/types": "npm:^7.25.2" + accepts: "npm:^1.3.7" + chalk: "npm:^4.0.0" + ci-info: "npm:^2.0.0" + connect: "npm:^3.6.5" + debug: "npm:^4.4.0" + error-stack-parser: "npm:^2.0.6" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + hermes-parser: "npm:0.32.0" + image-size: "npm:^1.0.2" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + jsc-safe-url: "npm:^0.2.2" + lodash.throttle: "npm:^4.1.1" + metro-babel-transformer: "npm:0.83.3" + metro-cache: "npm:0.83.3" + metro-cache-key: "npm:0.83.3" + metro-config: "npm:0.83.3" + metro-core: "npm:0.83.3" + metro-file-map: "npm:0.83.3" + metro-resolver: "npm:0.83.3" + metro-runtime: "npm:0.83.3" + metro-source-map: "npm:0.83.3" + metro-symbolicate: "npm:0.83.3" + metro-transform-plugins: "npm:0.83.3" + metro-transform-worker: "npm:0.83.3" + mime-types: "npm:^2.1.27" + nullthrows: "npm:^1.1.1" + serialize-error: "npm:^2.1.0" + source-map: "npm:^0.5.6" + throat: "npm:^5.0.0" + ws: "npm:^7.5.10" + yargs: "npm:^17.6.2" + bin: + metro: src/cli.js + checksum: 10/c989031710f02e51d3030660f1913870885647c5a216068333f7b4c43363f9ede03a9efb3b068b6750c6decab40f541376c3d81b32389d24932a46e10d19ebe1 + languageName: node + linkType: hard + "metro@npm:0.83.5, metro@npm:^0.83.3": version: 0.83.5 resolution: "metro@npm:0.83.5" @@ -11158,7 +11661,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -11464,7 +11967,7 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1.2.1, node-forge@npm:^1.3.1": +"node-forge@npm:^1.3.3": version: 1.3.3 resolution: "node-forge@npm:1.3.3" checksum: 10/f41c31b9296771a4b8c955d58417471712f54f324603a35f8e6cbac19d5e6eaaf5fd5fd14584dfedecbf46a05438ded6eee60a5f2f0822fc5061aaa073cfc75d @@ -11598,6 +12101,15 @@ __metadata: languageName: node linkType: hard +"ob1@npm:0.83.3": + version: 0.83.3 + resolution: "ob1@npm:0.83.3" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/20dfe91d48d0cadd97159cfd53f5abdca435b55d58b1f562e0687485e8f44f8a95e8ab3c835badd13d0d8c01e3d7b14d639a316aa4bf82841ac78b49611d4e5c + languageName: node + linkType: hard + "ob1@npm:0.83.5": version: 0.83.5 resolution: "ob1@npm:0.83.5" @@ -12558,7 +13070,7 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^19.0.0, react-is@npm:^19.1.0": +"react-is@npm:^19.1.0, react-is@npm:^19.2.0": version: 19.2.4 resolution: "react-is@npm:19.2.4" checksum: 10/3360fc50a38c23299c5003a709949f2439b2901e77962eea78d892f526f710d05a7777b600b302f853583d1861979b00d7a0a071c89c6562eac5740ac29b9665 @@ -12597,16 +13109,6 @@ __metadata: languageName: node linkType: hard -"react-native-edge-to-edge@npm:1.6.0": - version: 1.6.0 - resolution: "react-native-edge-to-edge@npm:1.6.0" - peerDependencies: - react: "*" - react-native: "*" - checksum: 10/9476f00c4cb60861799a4b306aa8e26275a503468f2b37e53af9c66a4eb2660b56b58f7bc4a77ee4c7ad7105cd489e186a08cda63a568c41217517b8f940be8a - languageName: node - linkType: hard - "react-native-monorepo-config@npm:^0.3.3": version: 0.3.3 resolution: "react-native-monorepo-config@npm:0.3.3" @@ -12648,9 +13150,14 @@ __metadata: version: 0.0.0-use.local resolution: "react-native-orientation-director-expo-plugin@workspace:plugin" dependencies: - expo: "npm:53.0.13" - expo-module-scripts: "npm:4.1.8" + expo: "npm:^54.0.0" + expo-module-scripts: "npm:55.0.2" glob: "npm:11.0.3" + peerDependencies: + expo: ">=54.0.0" + peerDependenciesMeta: + expo: + optional: true languageName: unknown linkType: soft @@ -12772,15 +13279,15 @@ __metadata: languageName: node linkType: hard -"react-test-renderer@npm:19.0.0": - version: 19.0.0 - resolution: "react-test-renderer@npm:19.0.0" +"react-test-renderer@npm:19.2.0": + version: 19.2.0 + resolution: "react-test-renderer@npm:19.2.0" dependencies: - react-is: "npm:^19.0.0" - scheduler: "npm:^0.25.0" + react-is: "npm:^19.2.0" + scheduler: "npm:^0.27.0" peerDependencies: - react: ^19.0.0 - checksum: 10/b95a90331e1dedeff2bbdcdc57b9cd1cd8d7cd620f9b29a4efd31a961c8e5b660fe55129ffc72f2bbf0c21fec34e6a498b9f07b6c65c22bf10ae87b68e124f91 + react: ^19.2.0 + checksum: 10/1a072bf5c383ee9cec1eed5872114a25d8029e8fabe17a9154cbb7b5d6e5570711efc3e80e336d170bb1f60e29d395087147891fa198743d17c29ff86782cde3 languageName: node linkType: hard @@ -13270,20 +13777,13 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:0.27.0": +"scheduler@npm:0.27.0, scheduler@npm:^0.27.0": version: 0.27.0 resolution: "scheduler@npm:0.27.0" checksum: 10/eab3c3a8373195173e59c147224fc30dabe6dd453f248f5e610e8458512a5a2ee3a06465dc400ebfe6d35c9f5b7f3bb6b2e41c88c86fd177c25a73e7286a1e06 languageName: node linkType: hard -"scheduler@npm:^0.25.0": - version: 0.25.0 - resolution: "scheduler@npm:0.25.0" - checksum: 10/e661e38503ab29a153429a99203fefa764f28b35c079719eb5efdd2c1c1086522f6653d8ffce388209682c23891a6d1d32fa6badf53c35fb5b9cd0c55ace42de - languageName: node - linkType: hard - "semver@npm:7.7.3": version: 7.7.3 resolution: "semver@npm:7.7.3" @@ -14045,21 +14545,21 @@ __metadata: languageName: node linkType: hard -"sucrase@npm:3.35.0": - version: 3.35.0 - resolution: "sucrase@npm:3.35.0" +"sucrase@npm:~3.35.1": + version: 3.35.1 + resolution: "sucrase@npm:3.35.1" dependencies: "@jridgewell/gen-mapping": "npm:^0.3.2" commander: "npm:^4.0.0" - glob: "npm:^10.3.10" lines-and-columns: "npm:^1.1.6" mz: "npm:^2.7.0" pirates: "npm:^4.0.1" + tinyglobby: "npm:^0.2.11" ts-interface-checker: "npm:^0.1.9" bin: sucrase: bin/sucrase sucrase-node: bin/sucrase-node - checksum: 10/bc601558a62826f1c32287d4fdfa4f2c09fe0fec4c4d39d0e257fd9116d7d6227a18309721d4185ec84c9dc1af0d5ec0e05a42a337fbb74fc293e068549aacbe + checksum: 10/539f5c6ebc1ff8d449a89eb52b8c8944a730b9840ddadbd299a7d89ebcf16c3f4bc9aa59e1f2e112a502e5cf1508f7e02065f0e97c0435eb9a7058e997dfff5a languageName: node linkType: hard @@ -14130,7 +14630,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^7.4.3, tar@npm:^7.5.4": +"tar@npm:^7.5.2, tar@npm:^7.5.4": version: 7.5.11 resolution: "tar@npm:7.5.11" dependencies: @@ -14143,13 +14643,6 @@ __metadata: languageName: node linkType: hard -"temp-dir@npm:~2.0.0": - version: 2.0.0 - resolution: "temp-dir@npm:2.0.0" - checksum: 10/cc4f0404bf8d6ae1a166e0e64f3f409b423f4d1274d8c02814a59a5529f07db6cd070a749664141b992b2c1af337fa9bb451a460a43bb9bcddc49f235d3115aa - languageName: node - linkType: hard - "terminal-link@npm:^2.1.1": version: 2.1.1 resolution: "terminal-link@npm:2.1.1" @@ -14231,7 +14724,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:0.2.15, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15": +"tinyglobby@npm:0.2.15, tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" dependencies: @@ -14542,7 +15035,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.8.3, typescript@npm:^5.9.2": +"typescript@npm:^5.9.2": version: 5.9.3 resolution: "typescript@npm:5.9.3" bin: @@ -14552,7 +15045,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.8.3#optional!builtin, typescript@patch:typescript@npm%3A^5.9.2#optional!builtin": +"typescript@patch:typescript@npm%3A^5.9.2#optional!builtin": version: 5.9.3 resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" bin: @@ -14667,15 +15160,6 @@ __metadata: languageName: node linkType: hard -"unique-string@npm:~2.0.0": - version: 2.0.0 - resolution: "unique-string@npm:2.0.0" - dependencies: - crypto-random-string: "npm:^2.0.0" - checksum: 10/107cae65b0b618296c2c663b8e52e4d1df129e9af04ab38d53b4f2189e96da93f599c85f4589b7ffaf1a11c9327cbb8a34f04c71b8d4950d3e385c2da2a93828 - languageName: node - linkType: hard - "universal-user-agent@npm:^7.0.0, universal-user-agent@npm:^7.0.2": version: 7.0.3 resolution: "universal-user-agent@npm:7.0.3"