expo 55.0.0-canary-20250919-7a31b96 → 55.0.0-canary-20251003-7b9d7ff

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -32,7 +32,7 @@ buildscript {
32
32
  def reactNativeVersion = project.extensions.getByType(ExpoModuleExtension).reactNativeVersion
33
33
 
34
34
  group = 'host.exp.exponent'
35
- version = '55.0.0-canary-20250919-7a31b96'
35
+ version = '55.0.0-canary-20251003-7b9d7ff'
36
36
 
37
37
  expoModule {
38
38
  // We can't prebuild the module because it depends on the generated files.
@@ -43,7 +43,7 @@ android {
43
43
  namespace "expo.core"
44
44
  defaultConfig {
45
45
  versionCode 1
46
- versionName "55.0.0-canary-20250919-7a31b96"
46
+ versionName "55.0.0-canary-20251003-7b9d7ff"
47
47
  consumerProguardFiles("proguard-rules.pro")
48
48
  }
49
49
  testOptions {
@@ -65,11 +65,11 @@ dependencies { dependencyHandler ->
65
65
  implementation 'com.facebook.react:react-android'
66
66
 
67
67
  testImplementation 'junit:junit:4.13.2'
68
- testImplementation 'androidx.test:core:1.5.0'
69
- testImplementation "com.google.truth:truth:1.1.2"
70
68
  testImplementation 'io.mockk:mockk:1.13.5'
69
+ testImplementation 'androidx.test:core:1.7.0'
70
+ testImplementation "com.google.truth:truth:1.4.5"
71
71
  testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2'
72
- testImplementation 'org.robolectric:robolectric:4.15.1'
72
+ testImplementation 'org.robolectric:robolectric:4.16'
73
73
 
74
74
  if (useLegacyAutolinking) {
75
75
  // Link expo modules as dependencies of the adapter. It uses `api` configuration so they all will be visible for the app as well.
@@ -11,6 +11,7 @@ import com.facebook.react.ReactPackageTurboModuleManagerDelegate
11
11
  import com.facebook.react.bridge.JSBundleLoader
12
12
  import com.facebook.react.bridge.ReactContext
13
13
  import com.facebook.react.common.annotations.UnstableReactNativeAPI
14
+ import com.facebook.react.common.build.ReactBuildConfig
14
15
  import com.facebook.react.defaults.DefaultComponentsRegistry
15
16
  import com.facebook.react.defaults.DefaultTurboModuleManagerDelegate
16
17
  import com.facebook.react.fabric.ComponentFactory
@@ -19,6 +20,7 @@ import com.facebook.react.runtime.JSRuntimeFactory
19
20
  import com.facebook.react.runtime.ReactHostDelegate
20
21
  import com.facebook.react.runtime.ReactHostImpl
21
22
  import com.facebook.react.runtime.hermes.HermesInstance
23
+ import expo.modules.core.interfaces.ReactNativeHostHandler
22
24
  import java.lang.ref.WeakReference
23
25
 
24
26
  object ExpoReactHostFactory {
@@ -27,10 +29,15 @@ object ExpoReactHostFactory {
27
29
  @UnstableReactNativeAPI
28
30
  private class ExpoReactHostDelegate(
29
31
  private val weakContext: WeakReference<Context>,
30
- private val reactNativeHostWrapper: ReactNativeHostWrapper,
32
+ private val packageList: List<ReactPackage>,
33
+ override val jsMainModulePath: String,
34
+ private val jsBundleAssetPath: String?,
35
+ private val jsBundleFilePath: String? = null,
36
+ private val useDevSupport: Boolean,
31
37
  override val bindingsInstaller: BindingsInstaller? = null,
32
38
  override val turboModuleManagerDelegateBuilder: ReactPackageTurboModuleManagerDelegate.Builder =
33
- DefaultTurboModuleManagerDelegate.Builder()
39
+ DefaultTurboModuleManagerDelegate.Builder(),
40
+ private val hostHandlers: List<ReactNativeHostHandler>
34
41
  ) : ReactHostDelegate {
35
42
 
36
43
  // Keeps this `_jsBundleLoader` backing property for DevLauncher to replace its internal value
@@ -42,33 +49,28 @@ object ExpoReactHostFactory {
42
49
  return backingJSBundleLoader
43
50
  }
44
51
  val context = weakContext.get() ?: throw IllegalStateException("Unable to get concrete Context")
45
- reactNativeHostWrapper.jsBundleFile?.let { jsBundleFile ->
52
+ jsBundleFilePath?.let { jsBundleFile ->
46
53
  if (jsBundleFile.startsWith("assets://")) {
47
54
  return JSBundleLoader.createAssetLoader(context, jsBundleFile, true)
48
55
  }
49
56
  return JSBundleLoader.createFileLoader(jsBundleFile)
50
57
  }
51
- val jsBundleAssetPath = reactNativeHostWrapper.bundleAssetName
58
+
52
59
  return JSBundleLoader.createAssetLoader(context, "assets://$jsBundleAssetPath", true)
53
60
  }
54
61
 
55
- override val jsMainModulePath: String
56
- get() = reactNativeHostWrapper.jsMainModuleName
57
-
58
62
  override val jsRuntimeFactory: JSRuntimeFactory
59
63
  get() = HermesInstance()
60
64
 
61
65
  override val reactPackages: List<ReactPackage>
62
- get() = reactNativeHostWrapper.packages
66
+ get() = packageList
63
67
 
64
68
  override fun handleInstanceException(error: Exception) {
65
- val handlers = reactNativeHostWrapper.reactNativeHostHandlers
66
- if (handlers.isEmpty()) {
69
+ if (hostHandlers.isEmpty()) {
67
70
  throw error
68
71
  }
69
- val useDeveloperSupport = reactNativeHostWrapper.useDeveloperSupport
70
- handlers.forEach { handler ->
71
- handler.onReactInstanceException(useDeveloperSupport, error)
72
+ hostHandlers.forEach { handler ->
73
+ handler.onReactInstanceException(useDevSupport, error)
72
74
  }
73
75
  }
74
76
  }
@@ -84,7 +86,6 @@ object ExpoReactHostFactory {
84
86
  }
85
87
  if (reactHost == null) {
86
88
  val useDeveloperSupport = reactNativeHost.useDeveloperSupport
87
- val reactHostDelegate = ExpoReactHostDelegate(WeakReference(context), reactNativeHost)
88
89
  val componentFactory = ComponentFactory()
89
90
  DefaultComponentsRegistry.register(componentFactory)
90
91
 
@@ -92,6 +93,16 @@ object ExpoReactHostFactory {
92
93
  handler.onWillCreateReactInstance(useDeveloperSupport)
93
94
  }
94
95
 
96
+ val reactHostDelegate = ExpoReactHostDelegate(
97
+ WeakReference(context),
98
+ reactNativeHost.packages,
99
+ reactNativeHost.jsMainModuleName,
100
+ reactNativeHost.bundleAssetName,
101
+ reactNativeHost.jsBundleFile,
102
+ reactNativeHost.useDeveloperSupport,
103
+ hostHandlers = reactNativeHost.reactNativeHostHandlers
104
+ )
105
+
95
106
  val reactHostImpl =
96
107
  ReactHostImpl(
97
108
  context,
@@ -117,4 +128,63 @@ object ExpoReactHostFactory {
117
128
  }
118
129
  return reactHost as ReactHost
119
130
  }
131
+
132
+ @OptIn(UnstableReactNativeAPI::class)
133
+ @JvmStatic
134
+ fun getDefaultReactHost(
135
+ context: Context,
136
+ packageList: List<ReactPackage>,
137
+ jsMainModulePath: String = ".expo/.virtual-metro-entry",
138
+ jsBundleAssetPath: String = "index.android.bundle",
139
+ jsBundleFilePath: String? = null,
140
+ jsRuntimeFactory: JSRuntimeFactory? = null,
141
+ useDevSupport: Boolean = ReactBuildConfig.DEBUG,
142
+ bindingsInstaller: BindingsInstaller? = null
143
+ ): ReactHost {
144
+ if (reactHost == null) {
145
+ val hostHandlers = ExpoModulesPackage.packageList
146
+ .flatMap { it.createReactNativeHostHandlers(context) }
147
+
148
+ val reactHostDelegate = ExpoReactHostDelegate(
149
+ WeakReference(context),
150
+ packageList,
151
+ jsMainModulePath,
152
+ jsBundleAssetPath,
153
+ jsBundleFilePath,
154
+ useDevSupport,
155
+ bindingsInstaller,
156
+ hostHandlers = hostHandlers
157
+ )
158
+ val componentFactory = ComponentFactory()
159
+ DefaultComponentsRegistry.register(componentFactory)
160
+
161
+ hostHandlers.forEach { handler ->
162
+ handler.onWillCreateReactInstance(useDevSupport)
163
+ }
164
+
165
+ val reactHostImpl =
166
+ ReactHostImpl(
167
+ context,
168
+ reactHostDelegate,
169
+ componentFactory,
170
+ true,
171
+ useDevSupport
172
+ )
173
+
174
+ hostHandlers.forEach { handler ->
175
+ handler.onDidCreateDevSupportManager(reactHostImpl.devSupportManager)
176
+ }
177
+
178
+ reactHostImpl.addReactInstanceEventListener(object : ReactInstanceEventListener {
179
+ override fun onReactContextInitialized(context: ReactContext) {
180
+ hostHandlers.forEach { handler ->
181
+ handler.onDidCreateReactInstance(useDevSupport, context)
182
+ }
183
+ }
184
+ })
185
+
186
+ reactHost = reactHostImpl
187
+ }
188
+ return reactHost as ReactHost
189
+ }
120
190
  }
@@ -64,7 +64,7 @@ class ReactActivityDelegateWrapper(
64
64
  }
65
65
  private val delayLoadAppHandler: DelayLoadAppHandler? by lazy {
66
66
  reactActivityHandlers.asSequence()
67
- .mapNotNull { it.getDelayLoadAppHandler(activity, reactNativeHost) }
67
+ .mapNotNull { it.getDelayLoadAppHandler(activity, reactHost) }
68
68
  .firstOrNull()
69
69
  }
70
70
 
@@ -7,12 +7,12 @@ import com.facebook.react.ReactActivity
7
7
  import com.facebook.react.ReactActivityDelegate
8
8
  import com.facebook.react.ReactApplication
9
9
  import com.facebook.react.ReactHost
10
- import com.facebook.react.ReactNativeHost
11
10
  import com.facebook.react.ReactRootView
12
11
  import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
13
12
  import com.facebook.react.defaults.DefaultReactActivityDelegate
14
13
  import com.facebook.react.interfaces.fabric.ReactSurface
15
14
  import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags
15
+ import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests
16
16
  import com.facebook.soloader.SoLoader
17
17
  import expo.modules.core.interfaces.Package
18
18
  import expo.modules.core.interfaces.ReactActivityHandler
@@ -59,6 +59,7 @@ internal class ReactActivityDelegateWrapperDelayLoadTest {
59
59
  fun setUp() {
60
60
  SoLoader.setInTestMode()
61
61
  mockkObject(ExpoModulesPackage.Companion)
62
+ ReactNativeFeatureFlagsForTests.setUp()
62
63
  mockkStatic(ReactNativeFeatureFlags::class)
63
64
  every { ReactNativeFeatureFlags.enableBridgelessArchitecture() } returns true
64
65
  every { ReactNativeFeatureFlags.enableFabricRenderer() } returns true
@@ -251,8 +252,6 @@ internal class MockApplication : Application(), ReactApplication {
251
252
  currentActivity = activity
252
253
  }
253
254
 
254
- override val reactNativeHost: ReactNativeHost = mockk<ReactNativeHost>(relaxed = true)
255
-
256
255
  override val reactHost: ReactHost by lazy {
257
256
  mockk<ReactHost>(relaxed = true)
258
257
  .also {
@@ -1,99 +1,99 @@
1
1
  {
2
- "@expo/fingerprint": "0.15.2-canary-20250919-7a31b96",
3
- "@expo/metro-runtime": "6.1.3-canary-20250919-7a31b96",
2
+ "@expo/fingerprint": "0.15.2-canary-20251003-7b9d7ff",
3
+ "@expo/metro-runtime": "6.1.3-canary-20251003-7b9d7ff",
4
4
  "@expo/vector-icons": "^15.0.2",
5
- "@expo/ui": "0.2.0-canary-20250919-7a31b96",
5
+ "@expo/ui": "0.2.0-canary-20251003-7b9d7ff",
6
6
  "@react-native-async-storage/async-storage": "2.2.0",
7
7
  "@react-native-community/datetimepicker": "8.4.4",
8
8
  "@react-native-masked-view/masked-view": "0.3.2",
9
9
  "@react-native-community/netinfo": "11.4.1",
10
10
  "@react-native-community/slider": "5.0.1",
11
11
  "@react-native-community/viewpager": "5.0.11",
12
- "@react-native-picker/picker": "2.11.1",
12
+ "@react-native-picker/picker": "2.11.2",
13
13
  "@react-native-segmented-control/segmented-control": "2.5.7",
14
14
  "@stripe/stripe-react-native": "0.50.3",
15
- "eslint-config-expo": "10.0.1-canary-20250919-7a31b96",
15
+ "eslint-config-expo": "10.0.1-canary-20251003-7b9d7ff",
16
16
  "expo-analytics-amplitude": "~11.3.0",
17
17
  "expo-app-auth": "~11.1.0",
18
18
  "expo-app-loader-provider": "~8.0.0",
19
- "expo-apple-authentication": "8.0.8-canary-20250919-7a31b96",
20
- "expo-application": "7.0.8-canary-20250919-7a31b96",
21
- "expo-asset": "12.0.10-canary-20250919-7a31b96",
22
- "expo-audio": "1.0.14-canary-20250919-7a31b96",
23
- "expo-auth-session": "7.0.9-canary-20250919-7a31b96",
24
- "expo-av": "16.0.8-canary-20250919-7a31b96",
25
- "expo-background-fetch": "14.0.8-canary-20250919-7a31b96",
26
- "expo-background-task": "1.1.0-canary-20250919-7a31b96",
27
- "expo-battery": "10.0.8-canary-20250919-7a31b96",
28
- "expo-blur": "15.0.8-canary-20250919-7a31b96",
29
- "expo-brightness": "14.0.8-canary-20250919-7a31b96",
30
- "expo-build-properties": "1.0.10-canary-20250919-7a31b96",
31
- "expo-calendar": "15.0.8-canary-20250919-7a31b96",
32
- "expo-camera": "17.0.9-canary-20250919-7a31b96",
33
- "expo-cellular": "8.0.8-canary-20250919-7a31b96",
34
- "expo-checkbox": "5.0.8-canary-20250919-7a31b96",
35
- "expo-clipboard": "8.0.8-canary-20250919-7a31b96",
36
- "expo-constants": "18.0.10-canary-20250919-7a31b96",
37
- "expo-contacts": "15.0.9-canary-20250919-7a31b96",
38
- "expo-crypto": "15.0.8-canary-20250919-7a31b96",
39
- "expo-dev-client": "6.0.13-canary-20250919-7a31b96",
40
- "expo-device": "8.1.0-canary-20250919-7a31b96",
41
- "expo-document-picker": "14.0.8-canary-20250919-7a31b96",
42
- "expo-file-system": "19.1.0-canary-20250919-7a31b96",
43
- "expo-font": "14.0.9-canary-20250919-7a31b96",
44
- "expo-gl": "16.0.8-canary-20250919-7a31b96",
45
- "expo-glass-effect": "0.1.5-canary-20250919-7a31b96",
19
+ "expo-apple-authentication": "8.0.8-canary-20251003-7b9d7ff",
20
+ "expo-application": "7.0.8-canary-20251003-7b9d7ff",
21
+ "expo-asset": "12.0.10-canary-20251003-7b9d7ff",
22
+ "expo-audio": "1.1.0-canary-20251003-7b9d7ff",
23
+ "expo-auth-session": "7.0.9-canary-20251003-7b9d7ff",
24
+ "expo-av": "16.0.8-canary-20251003-7b9d7ff",
25
+ "expo-background-fetch": "14.0.8-canary-20251003-7b9d7ff",
26
+ "expo-background-task": "1.0.9-canary-20251003-7b9d7ff",
27
+ "expo-battery": "10.0.8-canary-20251003-7b9d7ff",
28
+ "expo-blur": "15.0.8-canary-20251003-7b9d7ff",
29
+ "expo-brightness": "14.0.8-canary-20251003-7b9d7ff",
30
+ "expo-build-properties": "1.0.10-canary-20251003-7b9d7ff",
31
+ "expo-calendar": "15.0.8-canary-20251003-7b9d7ff",
32
+ "expo-camera": "17.0.9-canary-20251003-7b9d7ff",
33
+ "expo-cellular": "8.0.8-canary-20251003-7b9d7ff",
34
+ "expo-checkbox": "5.0.8-canary-20251003-7b9d7ff",
35
+ "expo-clipboard": "8.0.8-canary-20251003-7b9d7ff",
36
+ "expo-constants": "18.0.10-canary-20251003-7b9d7ff",
37
+ "expo-contacts": "15.0.10-canary-20251003-7b9d7ff",
38
+ "expo-crypto": "15.0.8-canary-20251003-7b9d7ff",
39
+ "expo-dev-client": "6.0.14-canary-20251003-7b9d7ff",
40
+ "expo-device": "8.0.10-canary-20251003-7b9d7ff",
41
+ "expo-document-picker": "14.0.8-canary-20251003-7b9d7ff",
42
+ "expo-file-system": "19.0.17-canary-20251003-7b9d7ff",
43
+ "expo-font": "14.0.9-canary-20251003-7b9d7ff",
44
+ "expo-gl": "16.0.8-canary-20251003-7b9d7ff",
45
+ "expo-glass-effect": "0.1.5-canary-20251003-7b9d7ff",
46
46
  "expo-google-app-auth": "~8.3.0",
47
- "expo-haptics": "15.0.8-canary-20250919-7a31b96",
48
- "expo-image": "3.1.0-canary-20250919-7a31b96",
49
- "expo-image-loader": "6.0.1-canary-20250919-7a31b96",
50
- "expo-image-manipulator": "14.0.8-canary-20250919-7a31b96",
51
- "expo-image-picker": "17.0.9-canary-20250919-7a31b96",
52
- "expo-intent-launcher": "13.0.8-canary-20250919-7a31b96",
53
- "expo-insights": "0.10.8-canary-20250919-7a31b96",
54
- "expo-keep-awake": "15.0.8-canary-20250919-7a31b96",
55
- "expo-linear-gradient": "15.0.8-canary-20250919-7a31b96",
56
- "expo-linking": "8.0.9-canary-20250919-7a31b96",
57
- "expo-local-authentication": "17.0.8-canary-20250919-7a31b96",
58
- "expo-localization": "17.0.8-canary-20250919-7a31b96",
59
- "expo-location": "19.0.8-canary-20250919-7a31b96",
60
- "expo-mail-composer": "15.0.8-canary-20250919-7a31b96",
61
- "expo-manifests": "1.0.9-canary-20250919-7a31b96",
62
- "expo-maps": "0.12.8-canary-20250919-7a31b96",
63
- "expo-media-library": "18.3.0-canary-20250919-7a31b96",
64
- "expo-mesh-gradient": "0.4.8-canary-20250919-7a31b96",
65
- "expo-module-template": "11.0.14-canary-20250919-7a31b96",
66
- "expo-modules-core": "3.0.18-canary-20250919-7a31b96",
67
- "expo-navigation-bar": "5.0.9-canary-20250919-7a31b96",
68
- "expo-network": "8.0.8-canary-20250919-7a31b96",
69
- "expo-notifications": "0.32.12-canary-20250919-7a31b96",
70
- "expo-print": "15.0.8-canary-20250919-7a31b96",
71
- "expo-live-photo": "1.0.8-canary-20250919-7a31b96",
72
- "expo-router": "6.0.8-canary-20250919-7a31b96",
73
- "expo-screen-capture": "8.0.9-canary-20250919-7a31b96",
74
- "expo-screen-orientation": "9.0.8-canary-20250919-7a31b96",
75
- "expo-secure-store": "15.0.8-canary-20250919-7a31b96",
76
- "expo-sensors": "15.0.8-canary-20250919-7a31b96",
77
- "expo-sharing": "14.0.8-canary-20250919-7a31b96",
78
- "expo-sms": "14.0.8-canary-20250919-7a31b96",
79
- "expo-speech": "14.0.8-canary-20250919-7a31b96",
80
- "expo-splash-screen": "31.0.11-canary-20250919-7a31b96",
81
- "expo-sqlite": "16.0.9-canary-20250919-7a31b96",
82
- "expo-status-bar": "3.0.9-canary-20250919-7a31b96",
83
- "expo-store-review": "9.0.8-canary-20250919-7a31b96",
84
- "expo-symbols": "1.0.8-canary-20250919-7a31b96",
85
- "expo-system-ui": "6.0.8-canary-20250919-7a31b96",
86
- "expo-task-manager": "14.0.8-canary-20250919-7a31b96",
87
- "expo-tracking-transparency": "6.0.8-canary-20250919-7a31b96",
88
- "expo-updates": "29.1.0-canary-20250919-7a31b96",
89
- "expo-video-thumbnails": "10.0.8-canary-20250919-7a31b96",
90
- "expo-video": "3.0.12-canary-20250919-7a31b96",
91
- "expo-web-browser": "15.0.8-canary-20250919-7a31b96",
92
- "jest-expo": "55.0.0-canary-20250919-7a31b96",
47
+ "expo-haptics": "15.0.8-canary-20251003-7b9d7ff",
48
+ "expo-image": "3.1.0-canary-20251003-7b9d7ff",
49
+ "expo-image-loader": "6.0.1-canary-20251003-7b9d7ff",
50
+ "expo-image-manipulator": "14.0.8-canary-20251003-7b9d7ff",
51
+ "expo-image-picker": "17.0.9-canary-20251003-7b9d7ff",
52
+ "expo-intent-launcher": "13.0.8-canary-20251003-7b9d7ff",
53
+ "expo-insights": "0.10.8-canary-20251003-7b9d7ff",
54
+ "expo-keep-awake": "15.0.8-canary-20251003-7b9d7ff",
55
+ "expo-linear-gradient": "15.0.8-canary-20251003-7b9d7ff",
56
+ "expo-linking": "8.0.9-canary-20251003-7b9d7ff",
57
+ "expo-local-authentication": "17.0.8-canary-20251003-7b9d7ff",
58
+ "expo-localization": "17.0.8-canary-20251003-7b9d7ff",
59
+ "expo-location": "19.0.8-canary-20251003-7b9d7ff",
60
+ "expo-mail-composer": "15.0.8-canary-20251003-7b9d7ff",
61
+ "expo-manifests": "1.0.9-canary-20251003-7b9d7ff",
62
+ "expo-maps": "0.12.9-canary-20251003-7b9d7ff",
63
+ "expo-media-library": "18.3.0-canary-20251003-7b9d7ff",
64
+ "expo-mesh-gradient": "0.4.8-canary-20251003-7b9d7ff",
65
+ "expo-module-template": "11.0.16-canary-20251003-7b9d7ff",
66
+ "expo-modules-core": "3.1.0-canary-20251003-7b9d7ff",
67
+ "expo-navigation-bar": "5.0.9-canary-20251003-7b9d7ff",
68
+ "expo-network": "8.0.8-canary-20251003-7b9d7ff",
69
+ "expo-notifications": "1.0.0-canary-20251003-7b9d7ff",
70
+ "expo-print": "15.0.8-canary-20251003-7b9d7ff",
71
+ "expo-live-photo": "1.0.8-canary-20251003-7b9d7ff",
72
+ "expo-router": "6.1.0-canary-20251003-7b9d7ff",
73
+ "expo-screen-capture": "8.0.9-canary-20251003-7b9d7ff",
74
+ "expo-screen-orientation": "9.0.8-canary-20251003-7b9d7ff",
75
+ "expo-secure-store": "15.0.8-canary-20251003-7b9d7ff",
76
+ "expo-sensors": "15.0.8-canary-20251003-7b9d7ff",
77
+ "expo-sharing": "14.0.8-canary-20251003-7b9d7ff",
78
+ "expo-sms": "14.0.8-canary-20251003-7b9d7ff",
79
+ "expo-speech": "14.0.8-canary-20251003-7b9d7ff",
80
+ "expo-splash-screen": "31.0.11-canary-20251003-7b9d7ff",
81
+ "expo-sqlite": "16.0.9-canary-20251003-7b9d7ff",
82
+ "expo-status-bar": "3.0.9-canary-20251003-7b9d7ff",
83
+ "expo-store-review": "9.0.9-canary-20251003-7b9d7ff",
84
+ "expo-symbols": "1.1.0-canary-20251003-7b9d7ff",
85
+ "expo-system-ui": "6.0.8-canary-20251003-7b9d7ff",
86
+ "expo-task-manager": "14.0.8-canary-20251003-7b9d7ff",
87
+ "expo-tracking-transparency": "6.0.8-canary-20251003-7b9d7ff",
88
+ "expo-updates": "29.1.0-canary-20251003-7b9d7ff",
89
+ "expo-video-thumbnails": "10.0.8-canary-20251003-7b9d7ff",
90
+ "expo-video": "3.0.12-canary-20251003-7b9d7ff",
91
+ "expo-web-browser": "15.0.9-canary-20251003-7b9d7ff",
92
+ "jest-expo": "55.0.0-canary-20251003-7b9d7ff",
93
93
  "lottie-react-native": "~7.3.1",
94
- "react": "19.1.0",
95
- "react-dom": "19.1.0",
96
- "react-native": "0.81.4",
94
+ "react": "19.1.1",
95
+ "react-dom": "19.1.1",
96
+ "react-native": "0.82.0-rc.5",
97
97
  "react-native-web": "~0.21.0",
98
98
  "react-native-gesture-handler": "~2.28.0",
99
99
  "react-native-get-random-values": "~1.11.0",
@@ -101,17 +101,17 @@
101
101
  "react-native-maps": "1.20.1",
102
102
  "react-native-pager-view": "6.9.1",
103
103
  "react-native-worklets": "0.5.1",
104
- "react-native-reanimated": "~4.1.0",
104
+ "react-native-reanimated": "~4.1.1",
105
105
  "react-native-screens": "~4.16.0",
106
106
  "react-native-safe-area-context": "~5.6.0",
107
107
  "react-native-svg": "15.12.1",
108
108
  "react-native-view-shot": "4.0.3",
109
109
  "react-native-webview": "13.15.0",
110
110
  "sentry-expo": "~7.0.0",
111
- "unimodules-app-loader": "6.0.8-canary-20250919-7a31b96",
111
+ "unimodules-app-loader": "6.0.8-canary-20251003-7b9d7ff",
112
112
  "unimodules-image-loader-interface": "~6.1.0",
113
113
  "@shopify/react-native-skia": "2.2.12",
114
114
  "@shopify/flash-list": "2.0.2",
115
- "@sentry/react-native": "~6.20.0",
115
+ "@sentry/react-native": "~7.1.0",
116
116
  "react-native-bootsplash": "^6.3.10"
117
117
  }
@@ -18,52 +18,23 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
18
18
  _ application: UIApplication,
19
19
  willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
20
20
  ) -> Bool {
21
- let parsedSubscribers = ExpoAppDelegateSubscriberRepository.subscribers.filter {
22
- $0.responds(to: #selector(application(_:willFinishLaunchingWithOptions:)))
23
- }
24
-
25
- // If we can't find a subscriber that implements `willFinishLaunchingWithOptions`, we will delegate the decision if we can handel the passed URL to
26
- // the `didFinishLaunchingWithOptions` method by returning `true` here.
27
- // You can read more about how iOS handles deep links here: https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application#discussion
28
- if parsedSubscribers.isEmpty {
29
- return true
30
- }
31
-
32
- return parsedSubscribers.reduce(false) { result, subscriber in
33
- return subscriber.application?(application, willFinishLaunchingWithOptions: launchOptions) ?? false || result
34
- }
21
+ return ExpoAppDelegateSubscriberManager.application(application, willFinishLaunchingWithOptions: launchOptions)
35
22
  }
36
23
 
37
24
  open func application(
38
25
  _ application: UIApplication,
39
26
  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
40
27
  ) -> Bool {
41
- ExpoAppDelegateSubscriberRepository.subscribers.forEach { subscriber in
42
- // Subscriber result is ignored as it doesn't matter if any subscriber handled the incoming URL – we always return `true` anyway.
43
- _ = subscriber.application?(application, didFinishLaunchingWithOptions: launchOptions)
44
- }
45
-
46
- return true
28
+ return ExpoAppDelegateSubscriberManager.application(application, didFinishLaunchingWithOptions: launchOptions)
47
29
  }
48
30
 
49
31
  #elseif os(macOS)
50
32
  open func applicationWillFinishLaunching(_ notification: Notification) {
51
- let parsedSubscribers = ExpoAppDelegateSubscriberRepository.subscribers.filter {
52
- $0.responds(to: #selector(applicationWillFinishLaunching(_:)))
53
- }
54
-
55
- parsedSubscribers.forEach { subscriber in
56
- subscriber.applicationWillFinishLaunching?(notification)
57
- }
33
+ ExpoAppDelegateSubscriberManager.applicationWillFinishLaunching(notification)
58
34
  }
59
35
 
60
36
  open func applicationDidFinishLaunching(_ notification: Notification) {
61
- ExpoAppDelegateSubscriberRepository
62
- .subscribers
63
- .forEach { subscriber in
64
- // Subscriber result is ignored as it doesn't matter if any subscriber handled the incoming URL – we always return `true` anyway.
65
- _ = subscriber.applicationDidFinishLaunching?(notification)
66
- }
37
+ ExpoAppDelegateSubscriberManager.applicationDidFinishLaunching(notification)
67
38
  }
68
39
 
69
40
  // TODO: - Configuring and Discarding Scenes
@@ -75,69 +46,49 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
75
46
 
76
47
  @objc
77
48
  open func applicationDidBecomeActive(_ application: UIApplication) {
78
- ExpoAppDelegateSubscriberRepository
79
- .subscribers
80
- .forEach { $0.applicationDidBecomeActive?(application) }
49
+ ExpoAppDelegateSubscriberManager.applicationDidBecomeActive(application)
81
50
  }
82
51
 
83
52
  @objc
84
53
  open func applicationWillResignActive(_ application: UIApplication) {
85
- ExpoAppDelegateSubscriberRepository
86
- .subscribers
87
- .forEach { $0.applicationWillResignActive?(application) }
54
+ ExpoAppDelegateSubscriberManager.applicationWillResignActive(application)
88
55
  }
89
56
 
90
57
  @objc
91
58
  open func applicationDidEnterBackground(_ application: UIApplication) {
92
- ExpoAppDelegateSubscriberRepository
93
- .subscribers
94
- .forEach { $0.applicationDidEnterBackground?(application) }
59
+ ExpoAppDelegateSubscriberManager.applicationDidEnterBackground(application)
95
60
  }
96
61
 
97
62
  open func applicationWillEnterForeground(_ application: UIApplication) {
98
- ExpoAppDelegateSubscriberRepository
99
- .subscribers
100
- .forEach { $0.applicationWillEnterForeground?(application) }
63
+ ExpoAppDelegateSubscriberManager.applicationWillEnterForeground(application)
101
64
  }
102
65
 
103
66
  open func applicationWillTerminate(_ application: UIApplication) {
104
- ExpoAppDelegateSubscriberRepository
105
- .subscribers
106
- .forEach { $0.applicationWillTerminate?(application) }
67
+ ExpoAppDelegateSubscriberManager.applicationWillTerminate(application)
107
68
  }
108
69
 
109
70
  #elseif os(macOS)
110
71
  @objc
111
72
  open func applicationDidBecomeActive(_ notification: Notification) {
112
- ExpoAppDelegateSubscriberRepository
113
- .subscribers
114
- .forEach { $0.applicationDidBecomeActive?(notification) }
73
+ ExpoAppDelegateSubscriberManager.applicationDidBecomeActive(notification)
115
74
  }
116
75
 
117
76
  @objc
118
77
  open func applicationWillResignActive(_ notification: Notification) {
119
- ExpoAppDelegateSubscriberRepository
120
- .subscribers
121
- .forEach { $0.applicationWillResignActive?(notification) }
78
+ ExpoAppDelegateSubscriberManager.applicationWillResignActive(notification)
122
79
  }
123
80
 
124
81
  @objc
125
82
  open func applicationDidHide(_ notification: Notification) {
126
- ExpoAppDelegateSubscriberRepository
127
- .subscribers
128
- .forEach { $0.applicationDidHide?(notification) }
83
+ ExpoAppDelegateSubscriberManager.applicationDidHide(notification)
129
84
  }
130
85
 
131
86
  open func applicationWillUnhide(_ notification: Notification) {
132
- ExpoAppDelegateSubscriberRepository
133
- .subscribers
134
- .forEach { $0.applicationWillUnhide?(notification) }
87
+ ExpoAppDelegateSubscriberManager.applicationWillUnhide(notification)
135
88
  }
136
89
 
137
90
  open func applicationWillTerminate(_ notification: Notification) {
138
- ExpoAppDelegateSubscriberRepository
139
- .subscribers
140
- .forEach { $0.applicationWillTerminate?(notification) }
91
+ ExpoAppDelegateSubscriberManager.applicationWillTerminate(notification)
141
92
  }
142
93
  #endif
143
94
 
@@ -153,28 +104,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
153
104
  handleEventsForBackgroundURLSession identifier: String,
154
105
  completionHandler: @escaping () -> Void
155
106
  ) {
156
- let selector = #selector(application(_:handleEventsForBackgroundURLSession:completionHandler:))
157
- let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
158
- var subscribersLeft = subs.count
159
- let dispatchQueue = DispatchQueue(label: "expo.application.handleBackgroundEvents")
160
-
161
- let handler = {
162
- dispatchQueue.sync {
163
- subscribersLeft -= 1
164
-
165
- if subscribersLeft == 0 {
166
- completionHandler()
167
- }
168
- }
169
- }
170
-
171
- if subs.isEmpty {
172
- completionHandler()
173
- } else {
174
- subs.forEach {
175
- $0.application?(application, handleEventsForBackgroundURLSession: identifier, completionHandler: handler)
176
- }
177
- }
107
+ ExpoAppDelegateSubscriberManager.application(application, handleEventsForBackgroundURLSession: identifier, completionHandler: completionHandler)
178
108
  }
179
109
 
180
110
  #endif
@@ -182,15 +112,11 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
182
112
  // MARK: - Handling Remote Notification Registration
183
113
 
184
114
  open func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
185
- ExpoAppDelegateSubscriberRepository
186
- .subscribers
187
- .forEach { $0.application?(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken) }
115
+ ExpoAppDelegateSubscriberManager.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
188
116
  }
189
117
 
190
118
  open func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
191
- ExpoAppDelegateSubscriberRepository
192
- .subscribers
193
- .forEach { $0.application?(application, didFailToRegisterForRemoteNotificationsWithError: error) }
119
+ ExpoAppDelegateSubscriberManager.application(application, didFailToRegisterForRemoteNotificationsWithError: error)
194
120
  }
195
121
 
196
122
  #if os(iOS) || os(tvOS)
@@ -199,42 +125,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
199
125
  didReceiveRemoteNotification userInfo: [AnyHashable: Any],
200
126
  fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
201
127
  ) {
202
- let selector = #selector(application(_:didReceiveRemoteNotification:fetchCompletionHandler:))
203
- let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
204
- var subscribersLeft = subs.count
205
- let dispatchQueue = DispatchQueue(label: "expo.application.remoteNotification", qos: .userInteractive)
206
- var failedCount = 0
207
- var newDataCount = 0
208
-
209
- let handler = { (result: UIBackgroundFetchResult) in
210
- dispatchQueue.sync {
211
- if result == .failed {
212
- failedCount += 1
213
- } else if result == .newData {
214
- newDataCount += 1
215
- }
216
-
217
- subscribersLeft -= 1
218
-
219
- if subscribersLeft == 0 {
220
- if newDataCount > 0 {
221
- completionHandler(.newData)
222
- } else if failedCount > 0 {
223
- completionHandler(.failed)
224
- } else {
225
- completionHandler(.noData)
226
- }
227
- }
228
- }
229
- }
230
-
231
- if subs.isEmpty {
232
- completionHandler(.noData)
233
- } else {
234
- subs.forEach { subscriber in
235
- subscriber.application?(application, didReceiveRemoteNotification: userInfo, fetchCompletionHandler: handler)
236
- }
237
- }
128
+ ExpoAppDelegateSubscriberManager.application(application, didReceiveRemoteNotification: userInfo, fetchCompletionHandler: completionHandler)
238
129
  }
239
130
 
240
131
  #elseif os(macOS)
@@ -242,23 +133,14 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
242
133
  _ application: NSApplication,
243
134
  didReceiveRemoteNotification userInfo: [String: Any]
244
135
  ) {
245
- let selector = #selector(application(_:didReceiveRemoteNotification:))
246
- let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
247
-
248
- subs.forEach { subscriber in
249
- subscriber.application?(application, didReceiveRemoteNotification: userInfo)
250
- }
136
+ ExpoAppDelegateSubscriberManager.application(application, didReceiveRemoteNotification: userInfo)
251
137
  }
252
138
  #endif
253
139
 
254
140
  // MARK: - Continuing User Activity and Handling Quick Actions
255
141
 
256
142
  open func application(_ application: UIApplication, willContinueUserActivityWithType userActivityType: String) -> Bool {
257
- return ExpoAppDelegateSubscriberRepository
258
- .subscribers
259
- .reduce(false) { result, subscriber in
260
- return subscriber.application?(application, willContinueUserActivityWithType: userActivityType) ?? false || result
261
- }
143
+ return ExpoAppDelegateSubscriberManager.application(application, willContinueUserActivityWithType: userActivityType)
262
144
  }
263
145
 
264
146
  #if os(iOS) || os(tvOS)
@@ -267,29 +149,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
267
149
  continue userActivity: NSUserActivity,
268
150
  restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
269
151
  ) -> Bool {
270
- let selector = #selector(application(_:continue:restorationHandler:))
271
- let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
272
- var subscribersLeft = subs.count
273
- let dispatchQueue = DispatchQueue(label: "expo.application.continueUserActivity", qos: .userInteractive)
274
- var allRestorableObjects = [UIUserActivityRestoring]()
275
-
276
- let handler = { (restorableObjects: [UIUserActivityRestoring]?) in
277
- dispatchQueue.sync {
278
- if let restorableObjects = restorableObjects {
279
- allRestorableObjects.append(contentsOf: restorableObjects)
280
- }
281
-
282
- subscribersLeft -= 1
283
-
284
- if subscribersLeft == 0 {
285
- restorationHandler(allRestorableObjects)
286
- }
287
- }
288
- }
289
-
290
- return subs.reduce(false) { result, subscriber in
291
- return subscriber.application?(application, continue: userActivity, restorationHandler: handler) ?? false || result
292
- }
152
+ return ExpoAppDelegateSubscriberManager.application(application, continue: userActivity, restorationHandler: restorationHandler)
293
153
  }
294
154
  #elseif os(macOS)
295
155
  open func application(
@@ -297,44 +157,16 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
297
157
  continue userActivity: NSUserActivity,
298
158
  restorationHandler: @escaping ([any NSUserActivityRestoring]) -> Void
299
159
  ) -> Bool {
300
- let selector = #selector(application(_:continue:restorationHandler:))
301
- let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
302
- var subscribersLeft = subs.count
303
- let dispatchQueue = DispatchQueue(label: "expo.application.continueUserActivity", qos: .userInteractive)
304
- var allRestorableObjects = [NSUserActivityRestoring]()
305
-
306
- let handler = { (restorableObjects: [NSUserActivityRestoring]?) in
307
- dispatchQueue.sync {
308
- if let restorableObjects = restorableObjects {
309
- allRestorableObjects.append(contentsOf: restorableObjects)
310
- }
311
-
312
- subscribersLeft -= 1
313
-
314
- if subscribersLeft == 0 {
315
- restorationHandler(allRestorableObjects)
316
- }
317
- }
318
- }
319
-
320
- return subs.reduce(false) { result, subscriber in
321
- return subscriber.application?(application, continue: userActivity, restorationHandler: handler) ?? false || result
322
- }
160
+ return ExpoAppDelegateSubscriberManager.application(application, continue: userActivity, restorationHandler: restorationHandler)
323
161
  }
324
162
  #endif
325
163
 
326
164
  open func application(_ application: UIApplication, didUpdate userActivity: NSUserActivity) {
327
- return ExpoAppDelegateSubscriberRepository
328
- .subscribers
329
- .forEach { $0.application?(application, didUpdate: userActivity) }
165
+ return ExpoAppDelegateSubscriberManager.application(application, didUpdate: userActivity)
330
166
  }
331
167
 
332
168
  open func application(_ application: UIApplication, didFailToContinueUserActivityWithType userActivityType: String, error: Error) {
333
- return ExpoAppDelegateSubscriberRepository
334
- .subscribers
335
- .forEach {
336
- $0.application?(application, didFailToContinueUserActivityWithType: userActivityType, error: error)
337
- }
169
+ return ExpoAppDelegateSubscriberManager.application(application, didFailToContinueUserActivityWithType: userActivityType, error: error)
338
170
  }
339
171
 
340
172
  #if os(iOS)
@@ -343,30 +175,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
343
175
  performActionFor shortcutItem: UIApplicationShortcutItem,
344
176
  completionHandler: @escaping (Bool) -> Void
345
177
  ) {
346
- let selector = #selector(application(_:performActionFor:completionHandler:))
347
- let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
348
- var subscribersLeft = subs.count
349
- var result: Bool = false
350
- let dispatchQueue = DispatchQueue(label: "expo.application.performAction", qos: .userInteractive)
351
-
352
- let handler = { (succeeded: Bool) in
353
- dispatchQueue.sync {
354
- result = result || succeeded
355
- subscribersLeft -= 1
356
-
357
- if subscribersLeft == 0 {
358
- completionHandler(result)
359
- }
360
- }
361
- }
362
-
363
- if subs.isEmpty {
364
- completionHandler(result)
365
- } else {
366
- subs.forEach { subscriber in
367
- subscriber.application?(application, performActionFor: shortcutItem, completionHandler: handler)
368
- }
369
- }
178
+ ExpoAppDelegateSubscriberManager.application(application, performActionFor: shortcutItem, completionHandler: completionHandler)
370
179
  }
371
180
  #endif
372
181
 
@@ -377,42 +186,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
377
186
  _ application: UIApplication,
378
187
  performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
379
188
  ) {
380
- let selector = #selector(application(_:performFetchWithCompletionHandler:))
381
- let subs = ExpoAppDelegateSubscriberRepository.subscribers.filter { $0.responds(to: selector) }
382
- var subscribersLeft = subs.count
383
- let dispatchQueue = DispatchQueue(label: "expo.application.performFetch", qos: .userInteractive)
384
- var failedCount = 0
385
- var newDataCount = 0
386
-
387
- let handler = { (result: UIBackgroundFetchResult) in
388
- dispatchQueue.sync {
389
- if result == .failed {
390
- failedCount += 1
391
- } else if result == .newData {
392
- newDataCount += 1
393
- }
394
-
395
- subscribersLeft -= 1
396
-
397
- if subscribersLeft == 0 {
398
- if newDataCount > 0 {
399
- completionHandler(.newData)
400
- } else if failedCount > 0 {
401
- completionHandler(.failed)
402
- } else {
403
- completionHandler(.noData)
404
- }
405
- }
406
- }
407
- }
408
-
409
- if subs.isEmpty {
410
- completionHandler(.noData)
411
- } else {
412
- subs.forEach { subscriber in
413
- subscriber.application?(application, performFetchWithCompletionHandler: handler)
414
- }
415
- }
189
+ ExpoAppDelegateSubscriberManager.application(application, performFetchWithCompletionHandler: completionHandler)
416
190
  }
417
191
 
418
192
  // TODO: - Interacting With WatchKit
@@ -424,15 +198,11 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
424
198
  #if os(iOS) || os(tvOS)
425
199
 
426
200
  open func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
427
- return ExpoAppDelegateSubscriberRepository.subscribers.reduce(false) { result, subscriber in
428
- return subscriber.application?(app, open: url, options: options) ?? false || result
429
- }
201
+ return ExpoAppDelegateSubscriberManager.application(app, open: url, options: options)
430
202
  }
431
203
  #elseif os(macOS)
432
204
  open func application(_ app: NSApplication, open urls: [URL]) {
433
- ExpoAppDelegateSubscriberRepository.subscribers.forEach { subscriber in
434
- subscriber.application?(app, open: urls)
435
- }
205
+ ExpoAppDelegateSubscriberManager.application(app, open: urls)
436
206
  }
437
207
  #endif
438
208
  // TODO: - Disallowing Specified App Extension Types
@@ -449,49 +219,7 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
449
219
  * a different orientation.
450
220
  */
451
221
  open func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
452
- let deviceOrientationMask = allowedOrientations(for: UIDevice.current.userInterfaceIdiom)
453
- let universalOrientationMask = allowedOrientations(for: .unspecified)
454
- let infoPlistOrientations = deviceOrientationMask.isEmpty ? universalOrientationMask : deviceOrientationMask
455
-
456
- let parsedSubscribers = ExpoAppDelegateSubscriberRepository.subscribers.filter {
457
- $0.responds(to: #selector(application(_:supportedInterfaceOrientationsFor:)))
458
- }
459
-
460
- // We want to create an intersection of all orientations set by subscribers.
461
- let subscribersMask: UIInterfaceOrientationMask = parsedSubscribers.reduce(.all) { result, subscriber in
462
- guard let requestedOrientation = subscriber.application?(application, supportedInterfaceOrientationsFor: window) else {
463
- return result
464
- }
465
- return requestedOrientation.intersection(result)
466
- }
467
- return parsedSubscribers.isEmpty ? infoPlistOrientations : subscribersMask
222
+ return ExpoAppDelegateSubscriberManager.application(application, supportedInterfaceOrientationsFor: window)
468
223
  }
469
224
  #endif
470
225
  }
471
-
472
- #if os(iOS)
473
- private func allowedOrientations(for userInterfaceIdiom: UIUserInterfaceIdiom) -> UIInterfaceOrientationMask {
474
- // For now only iPad-specific orientations are supported
475
- let deviceString = userInterfaceIdiom == .pad ? "~pad" : ""
476
- var mask: UIInterfaceOrientationMask = []
477
- guard let orientations = Bundle.main.infoDictionary?["UISupportedInterfaceOrientations\(deviceString)"] as? [String] else {
478
- return mask
479
- }
480
-
481
- for orientation in orientations {
482
- switch orientation {
483
- case "UIInterfaceOrientationPortrait":
484
- mask.insert(.portrait)
485
- case "UIInterfaceOrientationLandscapeLeft":
486
- mask.insert(.landscapeLeft)
487
- case "UIInterfaceOrientationLandscapeRight":
488
- mask.insert(.landscapeRight)
489
- case "UIInterfaceOrientationPortraitUpsideDown":
490
- mask.insert(.portraitUpsideDown)
491
- default:
492
- break
493
- }
494
- }
495
- return mask
496
- }
497
- #endif // os(iOS)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo",
3
- "version": "55.0.0-canary-20250919-7a31b96",
3
+ "version": "55.0.0-canary-20251003-7b9d7ff",
4
4
  "description": "The Expo SDK",
5
5
  "main": "src/Expo.ts",
6
6
  "module": "src/Expo.ts",
@@ -75,23 +75,23 @@
75
75
  "homepage": "https://github.com/expo/expo/tree/main/packages/expo",
76
76
  "dependencies": {
77
77
  "@babel/runtime": "^7.20.0",
78
- "@expo/cli": "54.0.8-canary-20250919-7a31b96",
79
- "@expo/config": "12.0.10-canary-20250919-7a31b96",
80
- "@expo/config-plugins": "54.0.2-canary-20250919-7a31b96",
81
- "@expo/devtools": "0.1.8-canary-20250919-7a31b96",
82
- "@expo/fingerprint": "0.15.2-canary-20250919-7a31b96",
78
+ "@expo/cli": "54.1.0-canary-20251003-7b9d7ff",
79
+ "@expo/config": "12.0.11-canary-20251003-7b9d7ff",
80
+ "@expo/config-plugins": "54.0.3-canary-20251003-7b9d7ff",
81
+ "@expo/devtools": "0.1.8-canary-20251003-7b9d7ff",
82
+ "@expo/fingerprint": "0.15.2-canary-20251003-7b9d7ff",
83
83
  "@expo/metro": "~54.0.0",
84
- "@expo/metro-config": "54.0.5-canary-20250919-7a31b96",
84
+ "@expo/metro-config": "54.0.7-canary-20251003-7b9d7ff",
85
85
  "@expo/vector-icons": "^15.0.2",
86
86
  "@ungap/structured-clone": "^1.3.0",
87
- "babel-preset-expo": "54.0.3-canary-20250919-7a31b96",
88
- "expo-asset": "12.0.10-canary-20250919-7a31b96",
89
- "expo-constants": "18.0.10-canary-20250919-7a31b96",
90
- "expo-file-system": "19.1.0-canary-20250919-7a31b96",
91
- "expo-font": "14.0.9-canary-20250919-7a31b96",
92
- "expo-keep-awake": "15.0.8-canary-20250919-7a31b96",
93
- "expo-modules-autolinking": "3.1.0-canary-20250919-7a31b96",
94
- "expo-modules-core": "3.0.18-canary-20250919-7a31b96",
87
+ "babel-preset-expo": "54.0.4-canary-20251003-7b9d7ff",
88
+ "expo-asset": "12.0.10-canary-20251003-7b9d7ff",
89
+ "expo-constants": "18.0.10-canary-20251003-7b9d7ff",
90
+ "expo-file-system": "19.0.17-canary-20251003-7b9d7ff",
91
+ "expo-font": "14.0.9-canary-20251003-7b9d7ff",
92
+ "expo-keep-awake": "15.0.8-canary-20251003-7b9d7ff",
93
+ "expo-modules-autolinking": "3.1.0-canary-20251003-7b9d7ff",
94
+ "expo-modules-core": "3.1.0-canary-20251003-7b9d7ff",
95
95
  "pretty-format": "^29.7.0",
96
96
  "react-refresh": "^0.14.2",
97
97
  "whatwg-url-without-unicode": "8.0.0-3"
@@ -100,15 +100,15 @@
100
100
  "@types/node": "^22.14.0",
101
101
  "@types/react": "~19.1.10",
102
102
  "@types/react-test-renderer": "~19.1.0",
103
- "expo-module-scripts": "5.0.8-canary-20250919-7a31b96",
104
- "react": "19.1.0",
105
- "react-dom": "19.1.0",
106
- "react-native": "0.81.4",
103
+ "expo-module-scripts": "5.0.8-canary-20251003-7b9d7ff",
104
+ "react": "19.1.1",
105
+ "react-dom": "19.1.1",
106
+ "react-native": "0.82.0-rc.5",
107
107
  "web-streams-polyfill": "^3.3.2"
108
108
  },
109
109
  "peerDependencies": {
110
- "@expo/dom-webview": "0.2.8-canary-20250919-7a31b96",
111
- "@expo/metro-runtime": "6.1.3-canary-20250919-7a31b96",
110
+ "@expo/dom-webview": "0.2.8-canary-20251003-7b9d7ff",
111
+ "@expo/metro-runtime": "6.1.3-canary-20251003-7b9d7ff",
112
112
  "react": "*",
113
113
  "react-native": "*",
114
114
  "react-native-webview": "*"
package/template.tgz CHANGED
Binary file