expo 55.0.0-canary-20260119-17896bf → 55.0.0-canary-20260120-bb71700

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.
Files changed (72) hide show
  1. package/Expo.podspec +1 -0
  2. package/android/build.gradle +5 -5
  3. package/android/src/main/java/expo/modules/ExpoReactHostFactory.kt +67 -32
  4. package/android/src/main/java/expo/modules/ReactActivityDelegateWrapper.kt +6 -9
  5. package/android/src/main/java/expo/modules/fetch/ExpoFetchModule.kt +4 -3
  6. package/android/src/main/java/expo/modules/fetch/NativeResponse.kt +3 -3
  7. package/android/src/main/java/expo/modules/fetch/ResponseSink.kt +7 -3
  8. package/android/src/test/java/expo/modules/ReactActivityDelegateWrapperDelayLoadTest.kt +2 -3
  9. package/build/Expo.d.ts +1 -1
  10. package/build/Expo.d.ts.map +1 -1
  11. package/build/async-require/buildErrors.d.ts +5 -0
  12. package/build/async-require/buildErrors.d.ts.map +1 -0
  13. package/build/async-require/getDevServer.d.ts.map +1 -1
  14. package/build/async-require/getFullBundlerUrl.d.ts +2 -0
  15. package/build/async-require/getFullBundlerUrl.d.ts.map +1 -0
  16. package/build/async-require/hmr.d.ts +8 -8
  17. package/build/async-require/hmr.d.ts.map +1 -1
  18. package/build/async-require/hmrUtils.d.ts +13 -0
  19. package/build/async-require/hmrUtils.d.ts.map +1 -0
  20. package/build/async-require/hmrUtils.native.d.ts +13 -0
  21. package/build/async-require/hmrUtils.native.d.ts.map +1 -0
  22. package/build/dom/dom-entry.d.ts.map +1 -1
  23. package/build/dom/dom-internal.types.d.ts +11 -0
  24. package/build/dom/dom-internal.types.d.ts.map +1 -0
  25. package/build/dom/dom.types.d.ts +5 -0
  26. package/build/dom/dom.types.d.ts.map +1 -1
  27. package/build/dom/internal.d.ts +1 -0
  28. package/build/dom/internal.d.ts.map +1 -1
  29. package/build/dom/webview-wrapper.d.ts +2 -2
  30. package/build/dom/webview-wrapper.d.ts.map +1 -1
  31. package/build/hooks/useEvent.d.ts +2 -2
  32. package/bundledNativeModules.json +99 -101
  33. package/ios/AppDelegates/AppDelegatesLoaderDelegate.swift +2 -0
  34. package/ios/AppDelegates/EXReactRootViewFactory.h +8 -1
  35. package/ios/AppDelegates/EXReactRootViewFactory.mm +26 -0
  36. package/ios/AppDelegates/ExpoAppDelegate.swift +14 -55
  37. package/ios/AppDelegates/ExpoReactNativeFactory.h +12 -0
  38. package/ios/AppDelegates/ExpoReactNativeFactory.mm +45 -0
  39. package/ios/AppDelegates/ExpoReactNativeFactory.swift +22 -1
  40. package/ios/Expo.h +2 -1
  41. package/ios/Fetch/ExpoFetchModule.swift +2 -2
  42. package/local-build-cache-provider.d.ts +1 -0
  43. package/local-build-cache-provider.js +1 -0
  44. package/package.json +29 -23
  45. package/src/Expo.fx.tsx +1 -25
  46. package/src/Expo.fx.web.tsx +2 -2
  47. package/src/Expo.ts +3 -0
  48. package/src/__tests__/__fbBatchedBridgeConfig-test.ts +7 -3
  49. package/src/async-require/asyncRequireModule.ts +2 -2
  50. package/src/async-require/buildErrors.ts +14 -0
  51. package/src/async-require/getDevServer.ts +3 -9
  52. package/src/async-require/getFullBundlerUrl.ts +13 -0
  53. package/src/async-require/hmr.ts +118 -103
  54. package/src/async-require/hmrUtils.native.ts +97 -0
  55. package/src/async-require/hmrUtils.ts +54 -0
  56. package/src/async-require/index.ts +1 -1
  57. package/src/async-require/setupFastRefresh.ts +3 -2
  58. package/src/dom/dom-entry.tsx +15 -8
  59. package/src/dom/dom-internal.types.ts +9 -0
  60. package/src/dom/dom.types.ts +6 -0
  61. package/src/dom/internal.ts +2 -0
  62. package/src/dom/webview-wrapper.tsx +14 -6
  63. package/src/hooks/useEvent.ts +2 -2
  64. package/template.tgz +0 -0
  65. package/types/react-native-web.d.ts +1 -1
  66. package/android/src/main/java/expo/modules/ReactNativeHostWrapper.kt +0 -51
  67. package/android/src/main/java/expo/modules/ReactNativeHostWrapperBase.kt +0 -107
  68. package/build/async-require/hmr.native.d.ts +0 -3
  69. package/build/async-require/hmr.native.d.ts.map +0 -1
  70. package/ios/AppDelegates/EXAppDelegateWrapper.h +0 -30
  71. package/ios/AppDelegates/EXAppDelegateWrapper.mm +0 -112
  72. package/src/async-require/hmr.native.ts +0 -3
@@ -1,120 +1,118 @@
1
1
  {
2
- "@expo/fingerprint": "0.15.5-canary-20260119-17896bf",
3
- "@expo/metro-runtime": "6.1.3-canary-20260119-17896bf",
4
- "@expo/vector-icons": "^15.0.3",
5
- "@expo/ui": "0.2.0-canary-20260119-17896bf",
2
+ "@expo/fingerprint": "0.15.5-canary-20260120-bb71700",
3
+ "@expo/metro-runtime": "6.2.0-canary-20260120-bb71700",
4
+ "@expo/vector-icons": "^15.0.2",
5
+ "@expo/ui": "0.2.0-canary-20260120-bb71700",
6
6
  "@react-native-async-storage/async-storage": "2.2.0",
7
- "@react-native-community/datetimepicker": "8.4.4",
7
+ "@react-native-community/datetimepicker": "8.6.0",
8
8
  "@react-native-masked-view/masked-view": "0.3.2",
9
9
  "@react-native-community/netinfo": "11.4.1",
10
- "@react-native-community/slider": "5.0.1",
10
+ "@react-native-community/slider": "5.1.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.4",
13
13
  "@react-native-segmented-control/segmented-control": "2.5.7",
14
- "@stripe/stripe-react-native": "0.50.3",
15
- "eslint-config-expo": "10.0.1-canary-20260119-17896bf",
16
- "expo-age-range": "0.2.2-canary-20260119-17896bf",
14
+ "@stripe/stripe-react-native": "0.57.2",
15
+ "eslint-config-expo": "10.0.1-canary-20260120-bb71700",
17
16
  "expo-analytics-amplitude": "~11.3.0",
18
17
  "expo-app-auth": "~11.1.0",
19
18
  "expo-app-loader-provider": "~8.0.0",
20
- "expo-apple-authentication": "8.0.9-canary-20260119-17896bf",
21
- "expo-application": "7.0.9-canary-20260119-17896bf",
22
- "expo-asset": "12.0.13-canary-20260119-17896bf",
23
- "expo-audio": "1.1.2-canary-20260119-17896bf",
24
- "expo-auth-session": "7.0.11-canary-20260119-17896bf",
25
- "expo-av": "16.0.9-canary-20260119-17896bf",
26
- "expo-background-fetch": "14.0.10-canary-20260119-17896bf",
27
- "expo-background-task": "1.0.11-canary-20260119-17896bf",
28
- "expo-battery": "10.0.9-canary-20260119-17896bf",
29
- "expo-blur": "15.0.9-canary-20260119-17896bf",
30
- "expo-brightness": "14.0.9-canary-20260119-17896bf",
31
- "expo-build-properties": "1.0.11-canary-20260119-17896bf",
32
- "expo-calendar": "15.0.9-canary-20260119-17896bf",
33
- "expo-camera": "17.0.11-canary-20260119-17896bf",
34
- "expo-cellular": "8.0.9-canary-20260119-17896bf",
35
- "expo-checkbox": "5.0.9-canary-20260119-17896bf",
36
- "expo-clipboard": "8.0.9-canary-20260119-17896bf",
37
- "expo-constants": "18.0.14-canary-20260119-17896bf",
38
- "expo-contacts": "15.0.12-canary-20260119-17896bf",
39
- "expo-crypto": "15.0.9-canary-20260119-17896bf",
40
- "expo-dev-client": "6.0.21-canary-20260119-17896bf",
41
- "expo-device": "8.0.11-canary-20260119-17896bf",
42
- "expo-document-picker": "14.0.9-canary-20260119-17896bf",
43
- "expo-file-system": "19.0.22-canary-20260119-17896bf",
44
- "expo-font": "14.0.11-canary-20260119-17896bf",
45
- "expo-gl": "16.0.10-canary-20260119-17896bf",
46
- "expo-glass-effect": "0.1.9-canary-20260119-17896bf",
19
+ "expo-apple-authentication": "8.0.9-canary-20260120-bb71700",
20
+ "expo-application": "7.0.9-canary-20260120-bb71700",
21
+ "expo-asset": "12.0.13-canary-20260120-bb71700",
22
+ "expo-audio": "1.2.0-canary-20260120-bb71700",
23
+ "expo-auth-session": "7.1.0-canary-20260120-bb71700",
24
+ "expo-background-fetch": "14.0.10-canary-20260120-bb71700",
25
+ "expo-background-task": "1.0.11-canary-20260120-bb71700",
26
+ "expo-battery": "10.0.9-canary-20260120-bb71700",
27
+ "expo-blur": "16.0.0-canary-20260120-bb71700",
28
+ "expo-brightness": "15.0.0-canary-20260120-bb71700",
29
+ "expo-build-properties": "2.0.0-canary-20260120-bb71700",
30
+ "expo-calendar": "15.1.0-canary-20260120-bb71700",
31
+ "expo-camera": "17.1.0-canary-20260120-bb71700",
32
+ "expo-cellular": "8.0.9-canary-20260120-bb71700",
33
+ "expo-checkbox": "5.0.9-canary-20260120-bb71700",
34
+ "expo-clipboard": "9.0.0-canary-20260120-bb71700",
35
+ "expo-constants": "18.1.0-canary-20260120-bb71700",
36
+ "expo-contacts": "15.1.0-canary-20260120-bb71700",
37
+ "expo-crypto": "15.1.0-canary-20260120-bb71700",
38
+ "expo-dev-client": "6.1.0-canary-20260120-bb71700",
39
+ "expo-device": "8.0.11-canary-20260120-bb71700",
40
+ "expo-document-picker": "14.0.9-canary-20260120-bb71700",
41
+ "expo-file-system": "19.0.22-canary-20260120-bb71700",
42
+ "expo-font": "14.1.0-canary-20260120-bb71700",
43
+ "expo-gl": "16.0.10-canary-20260120-bb71700",
44
+ "expo-glass-effect": "0.2.0-canary-20260120-bb71700",
47
45
  "expo-google-app-auth": "~8.3.0",
48
- "expo-haptics": "15.0.9-canary-20260119-17896bf",
49
- "expo-image": "3.0.12-canary-20260119-17896bf",
50
- "expo-image-loader": "6.0.1-canary-20260119-17896bf",
51
- "expo-image-manipulator": "14.0.9-canary-20260119-17896bf",
52
- "expo-image-picker": "17.0.11-canary-20260119-17896bf",
53
- "expo-intent-launcher": "13.0.9-canary-20260119-17896bf",
54
- "expo-insights": "0.10.9-canary-20260119-17896bf",
55
- "expo-keep-awake": "15.0.9-canary-20260119-17896bf",
56
- "expo-linear-gradient": "15.0.9-canary-20260119-17896bf",
57
- "expo-linking": "8.0.12-canary-20260119-17896bf",
58
- "expo-local-authentication": "17.0.9-canary-20260119-17896bf",
59
- "expo-localization": "17.0.9-canary-20260119-17896bf",
60
- "expo-location": "19.0.9-canary-20260119-17896bf",
61
- "expo-mail-composer": "15.0.9-canary-20260119-17896bf",
62
- "expo-manifests": "1.0.11-canary-20260119-17896bf",
63
- "expo-maps": "0.12.11-canary-20260119-17896bf",
46
+ "expo-haptics": "15.0.9-canary-20260120-bb71700",
47
+ "expo-image": "3.1.0-canary-20260120-bb71700",
48
+ "expo-image-loader": "7.0.0-canary-20260120-bb71700",
49
+ "expo-image-manipulator": "14.0.9-canary-20260120-bb71700",
50
+ "expo-image-picker": "17.1.0-canary-20260120-bb71700",
51
+ "expo-intent-launcher": "13.0.9-canary-20260120-bb71700",
52
+ "expo-insights": "0.10.9-canary-20260120-bb71700",
53
+ "expo-keep-awake": "15.0.9-canary-20260120-bb71700",
54
+ "expo-linear-gradient": "15.0.9-canary-20260120-bb71700",
55
+ "expo-linking": "8.0.12-canary-20260120-bb71700",
56
+ "expo-local-authentication": "17.0.9-canary-20260120-bb71700",
57
+ "expo-localization": "18.0.0-canary-20260120-bb71700",
58
+ "expo-location": "19.1.0-canary-20260120-bb71700",
59
+ "expo-mail-composer": "15.0.9-canary-20260120-bb71700",
60
+ "expo-manifests": "1.0.11-canary-20260120-bb71700",
61
+ "expo-maps": "0.13.0-canary-20260120-bb71700",
64
62
  "expo-mcp": "~0.2.1",
65
- "expo-media-library": "18.2.2-canary-20260119-17896bf",
66
- "expo-mesh-gradient": "0.4.9-canary-20260119-17896bf",
67
- "expo-module-template": "11.0.19-canary-20260119-17896bf",
68
- "expo-modules-core": "3.0.30-canary-20260119-17896bf",
69
- "expo-navigation-bar": "5.0.11-canary-20260119-17896bf",
70
- "expo-network": "8.0.9-canary-20260119-17896bf",
71
- "expo-notifications": "0.32.17-canary-20260119-17896bf",
72
- "expo-print": "15.0.9-canary-20260119-17896bf",
73
- "expo-live-photo": "1.0.9-canary-20260119-17896bf",
74
- "expo-router": "6.0.22-canary-20260119-17896bf",
75
- "expo-screen-capture": "8.0.10-canary-20260119-17896bf",
76
- "expo-screen-orientation": "9.0.9-canary-20260119-17896bf",
77
- "expo-secure-store": "15.0.9-canary-20260119-17896bf",
78
- "expo-sensors": "15.0.9-canary-20260119-17896bf",
79
- "expo-server": "1.0.6-canary-20260119-17896bf",
80
- "expo-sharing": "14.0.9-canary-20260119-17896bf",
81
- "expo-sms": "14.0.9-canary-20260119-17896bf",
82
- "expo-speech": "14.0.9-canary-20260119-17896bf",
83
- "expo-splash-screen": "31.0.14-canary-20260119-17896bf",
84
- "expo-sqlite": "16.0.11-canary-20260119-17896bf",
85
- "expo-status-bar": "3.0.10-canary-20260119-17896bf",
86
- "expo-store-review": "9.0.10-canary-20260119-17896bf",
87
- "expo-symbols": "1.0.9-canary-20260119-17896bf",
88
- "expo-system-ui": "6.0.10-canary-20260119-17896bf",
89
- "expo-task-manager": "14.0.10-canary-20260119-17896bf",
90
- "expo-tracking-transparency": "6.0.9-canary-20260119-17896bf",
91
- "expo-updates": "29.0.17-canary-20260119-17896bf",
92
- "expo-video-thumbnails": "10.0.9-canary-20260119-17896bf",
93
- "expo-video": "3.0.16-canary-20260119-17896bf",
94
- "expo-web-browser": "15.0.11-canary-20260119-17896bf",
95
- "jest-expo": "55.0.0-canary-20260119-17896bf",
96
- "lottie-react-native": "~7.3.1",
97
- "react": "19.1.0",
98
- "react-dom": "19.1.0",
99
- "react-native": "0.81.5",
63
+ "expo-media-library": "18.3.0-canary-20260120-bb71700",
64
+ "expo-mesh-gradient": "0.4.9-canary-20260120-bb71700",
65
+ "expo-module-template": "11.0.19-canary-20260120-bb71700",
66
+ "expo-modules-core": "4.0.0-canary-20260120-bb71700",
67
+ "expo-navigation-bar": "5.0.11-canary-20260120-bb71700",
68
+ "expo-network": "8.0.9-canary-20260120-bb71700",
69
+ "expo-notifications": "1.0.0-canary-20260120-bb71700",
70
+ "expo-print": "15.0.9-canary-20260120-bb71700",
71
+ "expo-live-photo": "1.0.9-canary-20260120-bb71700",
72
+ "expo-router": "7.0.0-canary-20260120-bb71700",
73
+ "expo-screen-capture": "8.0.10-canary-20260120-bb71700",
74
+ "expo-screen-orientation": "9.0.9-canary-20260120-bb71700",
75
+ "expo-secure-store": "15.0.9-canary-20260120-bb71700",
76
+ "expo-sensors": "15.0.9-canary-20260120-bb71700",
77
+ "expo-server": "1.1.0-canary-20260120-bb71700",
78
+ "expo-sharing": "14.0.9-canary-20260120-bb71700",
79
+ "expo-sms": "14.0.9-canary-20260120-bb71700",
80
+ "expo-speech": "14.1.0-canary-20260120-bb71700",
81
+ "expo-splash-screen": "31.0.14-canary-20260120-bb71700",
82
+ "expo-sqlite": "16.1.0-canary-20260120-bb71700",
83
+ "expo-status-bar": "3.0.10-canary-20260120-bb71700",
84
+ "expo-store-review": "9.0.10-canary-20260120-bb71700",
85
+ "expo-symbols": "1.1.0-canary-20260120-bb71700",
86
+ "expo-system-ui": "6.0.10-canary-20260120-bb71700",
87
+ "expo-task-manager": "14.0.10-canary-20260120-bb71700",
88
+ "expo-tracking-transparency": "6.0.9-canary-20260120-bb71700",
89
+ "expo-updates": "29.1.0-canary-20260120-bb71700",
90
+ "expo-video-thumbnails": "10.0.9-canary-20260120-bb71700",
91
+ "expo-video": "4.0.0-canary-20260120-bb71700",
92
+ "expo-web-browser": "15.0.11-canary-20260120-bb71700",
93
+ "jest-expo": "55.0.0-canary-20260120-bb71700",
94
+ "lottie-react-native": "~7.3.4",
95
+ "react": "19.2.0",
96
+ "react-dom": "19.2.0",
97
+ "react-native": "0.83.1",
100
98
  "react-native-web": "~0.21.0",
101
- "react-native-gesture-handler": "~2.28.0",
99
+ "react-native-gesture-handler": "~2.30.0",
102
100
  "react-native-get-random-values": "~1.11.0",
103
- "react-native-keyboard-controller": "1.18.5",
104
- "react-native-maps": "1.20.1",
105
- "react-native-pager-view": "6.9.1",
106
- "react-native-worklets": "0.5.1",
107
- "react-native-reanimated": "~4.1.1",
108
- "react-native-screens": "~4.16.0",
109
- "react-native-safe-area-context": "~5.6.0",
110
- "react-native-svg": "15.12.1",
101
+ "react-native-keyboard-controller": "1.20.4",
102
+ "react-native-maps": "1.26.20",
103
+ "react-native-pager-view": "8.0.0",
104
+ "react-native-worklets": "0.7.1",
105
+ "react-native-reanimated": "~4.2.1",
106
+ "react-native-screens": "~4.20.0",
107
+ "react-native-safe-area-context": "~5.6.2",
108
+ "react-native-svg": "15.15.1",
111
109
  "react-native-view-shot": "4.0.3",
112
- "react-native-webview": "13.15.0",
113
- "react-server-dom-webpack": "~19.1.4",
110
+ "react-native-webview": "13.16.0",
111
+ "react-server-dom-webpack": "~19.2.3",
114
112
  "sentry-expo": "~7.0.0",
115
- "unimodules-app-loader": "6.0.9-canary-20260119-17896bf",
113
+ "unimodules-app-loader": "6.0.9-canary-20260120-bb71700",
116
114
  "unimodules-image-loader-interface": "~6.1.0",
117
- "@shopify/react-native-skia": "2.2.12",
115
+ "@shopify/react-native-skia": "2.4.14",
118
116
  "@shopify/flash-list": "2.0.2",
119
117
  "@sentry/react-native": "~7.2.0",
120
118
  "react-native-bootsplash": "^6.3.10"
@@ -2,6 +2,8 @@
2
2
 
3
3
  import ExpoModulesCore
4
4
 
5
+ @MainActor
6
+ @preconcurrency
5
7
  @objc
6
8
  public class AppDelegatesLoaderDelegate: NSObject {
7
9
  /**
@@ -15,7 +15,7 @@ NS_SWIFT_NAME(ExpoReactRootViewFactory)
15
15
  @property (nonatomic, weak, nullable) EXReactDelegate *reactDelegate;
16
16
 
17
17
  /**
18
- Initializer for EXAppDelegateWrapper integration
18
+ Initializer for ExpoReactNativeFactory integration
19
19
  */
20
20
  - (instancetype)initWithReactDelegate:(nullable EXReactDelegate *)reactDelegate
21
21
  configuration:(RCTRootViewFactoryConfiguration *)configuration
@@ -24,9 +24,16 @@ NS_SWIFT_NAME(ExpoReactRootViewFactory)
24
24
  /**
25
25
  Calls super `viewWithModuleName:initialProperties:launchOptions:` from `RCTRootViewFactory`.
26
26
  */
27
+ #if TARGET_OS_IOS
28
+ - (UIView *)superViewWithModuleName:(NSString *)moduleName
29
+ initialProperties:(nullable NSDictionary *)initialProperties
30
+ launchOptions:(nullable NSDictionary *)launchOptions
31
+ devMenuConfiguration:(nullable RCTDevMenuConfiguration *)devMenuConfiguration;
32
+ #else
27
33
  - (UIView *)superViewWithModuleName:(NSString *)moduleName
28
34
  initialProperties:(nullable NSDictionary *)initialProperties
29
35
  launchOptions:(nullable NSDictionary *)launchOptions;
36
+ #endif
30
37
 
31
38
  @end
32
39
 
@@ -3,6 +3,7 @@
3
3
  #import <Expo/EXReactRootViewFactory.h>
4
4
  #import <Expo/RCTAppDelegateUmbrella.h>
5
5
  #import <Expo/Swift.h>
6
+ #import <React/RCTDevMenu.h>
6
7
 
7
8
  // When `use_frameworks!` is used, the generated Swift header is inside ExpoModulesCore module.
8
9
  // Otherwise, it's available only locally with double-quoted imports.
@@ -30,6 +31,30 @@
30
31
  return self;
31
32
  }
32
33
 
34
+ #if TARGET_OS_IOS
35
+ - (UIView *)viewWithModuleName:(NSString *)moduleName
36
+ initialProperties:(nullable NSDictionary *)initialProperties
37
+ launchOptions:(nullable NSDictionary *)launchOptions
38
+ devMenuConfiguration:(RCTDevMenuConfiguration *)devMenuConfiguration
39
+ {
40
+ if (self.reactDelegate != nil) {
41
+ return [self.reactDelegate createReactRootViewWithModuleName:moduleName initialProperties:initialProperties launchOptions:launchOptions];
42
+ }
43
+ return [super viewWithModuleName:moduleName initialProperties:initialProperties launchOptions:launchOptions devMenuConfiguration:devMenuConfiguration];
44
+ }
45
+
46
+ - (UIView *)superViewWithModuleName:(NSString *)moduleName
47
+ initialProperties:(nullable NSDictionary *)initialProperties
48
+ launchOptions:(nullable NSDictionary *)launchOptions
49
+ devMenuConfiguration:(nullable RCTDevMenuConfiguration *)devMenuConfiguration
50
+ {
51
+ if (devMenuConfiguration == nil) {
52
+ devMenuConfiguration = [RCTDevMenuConfiguration defaultConfiguration];
53
+ }
54
+
55
+ return [super viewWithModuleName:moduleName initialProperties:initialProperties launchOptions:launchOptions devMenuConfiguration:devMenuConfiguration];
56
+ }
57
+ #else
33
58
  - (UIView *)viewWithModuleName:(NSString *)moduleName
34
59
  initialProperties:(nullable NSDictionary *)initialProperties
35
60
  launchOptions:(nullable NSDictionary *)launchOptions
@@ -46,6 +71,7 @@
46
71
  {
47
72
  return [super viewWithModuleName:moduleName initialProperties:initialProperties launchOptions:launchOptions];
48
73
  }
74
+ #endif
49
75
 
50
76
  - (NSURL *)bundleURL
51
77
  {
@@ -1,70 +1,29 @@
1
- import Dispatch
2
1
  import Foundation
3
2
  import ExpoModulesCore
4
- import ReactAppDependencyProvider
5
3
 
6
4
  /**
7
- Note: you cannot subclass Swift from Objective-C, use EXAppDelegateWrapper with Obj-C app delegates
8
5
  Allows classes extending `ExpoAppDelegateSubscriber` to hook into project's app delegate
9
6
  by forwarding `UIApplicationDelegate` events to the subscribers.
10
7
 
11
8
  Keep functions and markers in sync with https://developer.apple.com/documentation/uikit/uiapplicationdelegate
12
9
  */
13
10
  @objc(EXExpoAppDelegate)
14
- open class ExpoAppDelegate: UIResponder, @preconcurrency ReactNativeFactoryProvider, UIApplicationDelegate {
15
- @objc public var factory: RCTReactNativeFactory?
16
- private let defaultModuleName = "main"
17
- private let defaultInitialProps = [AnyHashable: Any]()
18
-
19
- public func bindReactNativeFactory(_ factory: RCTReactNativeFactory) {
20
- self.factory = factory
21
- }
22
-
23
- public func recreateRootView(
24
- withBundleURL: URL?,
25
- moduleName: String?,
26
- initialProps: [AnyHashable: Any]?,
27
- launchOptions: [AnyHashable: Any]?
28
- ) -> UIView {
29
- guard let delegate = self.factory?.delegate,
30
- let rootViewFactory = self.factory?.rootViewFactory else {
31
- fatalError("recreateRootView: Missing factory in ExpoAppDelegate")
32
- }
33
-
34
- if delegate.newArchEnabled() {
35
- // chrfalch: rootViewFactory.reactHost is not available here in swift due to the underlying RCTHost type of the property. (todo: check)
36
- assert(rootViewFactory.value(forKey: "reactHost") == nil, "recreateRootViewWithBundleURL: does not support when react instance is created")
37
- } else {
38
- assert(rootViewFactory.bridge == nil, "recreateRootViewWithBundleURL: does not support when react instance is created")
39
- }
40
-
41
- let configuration = rootViewFactory.value(forKey: "_configuration") as? RCTRootViewFactoryConfiguration
42
-
43
- if let bundleURL = withBundleURL {
44
- configuration?.bundleURLBlock = {
45
- return bundleURL
46
- }
47
- }
48
-
49
- let rootView: UIView
50
- if let factory = rootViewFactory as? ExpoReactRootViewFactory {
51
- // When calling `recreateRootViewWithBundleURL:` from `EXReactRootViewFactory`,
52
- // we don't want to loop the ReactDelegate again. Otherwise, it will be an infinite loop.
53
- rootView = factory.superView(
54
- withModuleName: moduleName ?? defaultModuleName,
55
- initialProperties: initialProps,
56
- launchOptions: launchOptions ?? [:]
57
- )
58
- } else {
59
- rootView = rootViewFactory.view(
60
- withModuleName: moduleName ?? defaultModuleName,
61
- initialProperties: initialProps,
62
- launchOptions: launchOptions
63
- )
11
+ open class ExpoAppDelegate: UIResponder, UIApplicationDelegate {
12
+ override public init() {
13
+ // The subscribers are initializing and registering before the main code starts executing.
14
+ // Here we're letting them know when the `AppDelegate` is being created,
15
+ // which happens at the beginning of the main code execution and before launching the app.
16
+ ExpoAppDelegateSubscriberRepository.subscribers.forEach {
17
+ $0.appDelegateWillBeginInitialization?()
64
18
  }
19
+ super.init()
20
+ }
65
21
 
66
- return rootView
22
+ #if os(macOS)
23
+ required public init?(coder: NSCoder) {
24
+ super.init(coder: coder)
67
25
  }
26
+ #endif
68
27
 
69
28
  // MARK: - Initializing the App
70
29
  #if os(iOS) || os(tvOS)
@@ -148,7 +107,7 @@ open class ExpoAppDelegate: UIResponder, @preconcurrency ReactNativeFactoryProvi
148
107
  #endif
149
108
 
150
109
  // MARK: - Responding to Environment Changes
151
-
110
+
152
111
  #if os(iOS) || os(tvOS)
153
112
 
154
113
  open func applicationDidReceiveMemoryWarning(_ application: UIApplication) {
@@ -0,0 +1,12 @@
1
+ // Copyright 2025-present 650 Industries. All rights reserved.
2
+
3
+ #import <ExpoModulesCore/ExpoModulesCore.h>
4
+ #import <Expo/RCTAppDelegateUmbrella.h>
5
+
6
+ @protocol RCTHostDelegate;
7
+ @protocol RCTHostRuntimeDelegate;
8
+
9
+ NS_SWIFT_NAME(ExpoReactNativeFactoryObjC)
10
+ @interface EXReactNativeFactory : RCTReactNativeFactory <RCTHostDelegate, RCTHostRuntimeDelegate>
11
+
12
+ @end
@@ -0,0 +1,45 @@
1
+ // Copyright 2025-present 650 Industries. All rights reserved.
2
+
3
+ #import <Expo/ExpoReactNativeFactory.h>
4
+
5
+ #import <ExpoModulesCore/ExpoModulesCore.h>
6
+ #import <ExpoModulesCore/EXRuntime.h>
7
+ #if __has_include(<ExpoModulesCore/ExpoModulesCore-Swift.h>)
8
+ #import <ExpoModulesCore/ExpoModulesCore-Swift.h>
9
+ #else
10
+ #import "ExpoModulesCore-Swift.h"
11
+ #endif
12
+ #import <ReactCommon/RCTHost.h>
13
+
14
+ @implementation EXReactNativeFactory {
15
+ EXAppContext *_appContext;
16
+ }
17
+
18
+ #pragma mark - RCTHostDelegate
19
+
20
+ // [main thread]
21
+ - (void)hostDidStart:(nonnull RCTHost *)host
22
+ {
23
+ // Setting the runtime delegate here doesn't feel right, but there is no other way
24
+ // to capture the `host:didInitializeRuntime:` method call.
25
+ // With the current API design we also depend that the runtime is initialized after the host started,
26
+ // which isn't obvious, especially they are invoked on different threads.
27
+ // Ideally if the current `RCTHostRuntimeDelegate` is part of `RCTHostDelegate`.
28
+ host.runtimeDelegate = self;
29
+ }
30
+
31
+ #pragma mark - RCTHostRuntimeDelegate
32
+
33
+ // [JS thread]
34
+ - (void)host:(nonnull RCTHost *)host didInitializeRuntime:(jsi::Runtime &)runtime
35
+ {
36
+ _appContext = [[EXAppContext alloc] init];
37
+
38
+ // Inject and decorate the `global.expo` object
39
+ _appContext._runtime = [[EXRuntime alloc] initWithRuntime:runtime];
40
+ [_appContext setHostWrapper:[[EXHostWrapper alloc] initWithHost:host]];
41
+
42
+ [_appContext registerNativeModules];
43
+ }
44
+
45
+ @end
@@ -2,8 +2,10 @@
2
2
 
3
3
  import React
4
4
 
5
- public class ExpoReactNativeFactory: RCTReactNativeFactory, ExpoReactNativeFactoryProtocol {
5
+ public class ExpoReactNativeFactory: ExpoReactNativeFactoryObjC, ExpoReactNativeFactoryProtocol {
6
6
  private let defaultModuleName = "main"
7
+
8
+ @MainActor
7
9
  private lazy var reactDelegate: ExpoReactDelegate = {
8
10
  ExpoReactDelegate(
9
11
  handlers: ExpoAppDelegateSubscriberRepository.reactDelegateHandlers,
@@ -118,19 +120,38 @@ public class ExpoReactNativeFactory: RCTReactNativeFactory, ExpoReactNativeFacto
118
120
 
119
121
  let rootView: UIView
120
122
  if let factory = self.rootViewFactory as? ExpoReactRootViewFactory {
123
+ // RCTDevMenuConfiguration is only available in react-native 0.83+
124
+ #if os(iOS)
121
125
  // When calling `recreateRootViewWithBundleURL:` from `EXReactRootViewFactory`,
122
126
  // we don't want to loop the ReactDelegate again. Otherwise, it will be an infinite loop.
127
+ rootView = factory.superView(
128
+ withModuleName: moduleName ?? defaultModuleName,
129
+ initialProperties: initialProps,
130
+ launchOptions: launchOptions ?? [:],
131
+ devMenuConfiguration: self.devMenuConfiguration
132
+ )
133
+ #else
123
134
  rootView = factory.superView(
124
135
  withModuleName: moduleName ?? defaultModuleName,
125
136
  initialProperties: initialProps,
126
137
  launchOptions: launchOptions ?? [:]
127
138
  )
139
+ #endif
128
140
  } else {
141
+ #if os(iOS)
142
+ rootView = rootViewFactory.view(
143
+ withModuleName: moduleName ?? defaultModuleName,
144
+ initialProperties: initialProps,
145
+ launchOptions: launchOptions,
146
+ devMenuConfiguration: self.devMenuConfiguration
147
+ )
148
+ #else
129
149
  rootView = rootViewFactory.view(
130
150
  withModuleName: moduleName ?? defaultModuleName,
131
151
  initialProperties: initialProps,
132
152
  launchOptions: launchOptions
133
153
  )
154
+ #endif
134
155
  }
135
156
 
136
157
  return rootView
package/ios/Expo.h CHANGED
@@ -1,3 +1,4 @@
1
1
  #import <ExpoModulesCore/ExpoModulesCore.h>
2
2
  #import <Expo/EXAppDefinesLoader.h>
3
- #import <Expo/EXAppDelegateWrapper.h>
3
+ #import <Expo/ExpoReactNativeFactory.h>
4
+ #import <Expo/RCTAppDelegateUmbrella.h>
@@ -3,9 +3,9 @@
3
3
  @preconcurrency import ExpoModulesCore
4
4
 
5
5
  private let fetchRequestQueue = DispatchQueue(label: "expo.modules.fetch.RequestQueue")
6
- @MainActor internal var urlSessionConfigurationProvider: NSURLSessionConfigurationProvider?
6
+ nonisolated(unsafe) internal var urlSessionConfigurationProvider: NSURLSessionConfigurationProvider?
7
7
 
8
- @MainActor public final class ExpoFetchModule: @preconcurrency Module {
8
+ public final class ExpoFetchModule: Module {
9
9
  private lazy var urlSession = createURLSession()
10
10
  private let urlSessionDelegate: URLSessionSessionDelegateProxy
11
11
 
@@ -0,0 +1 @@
1
+ export * from '@expo/local-build-cache-provider';
@@ -0,0 +1 @@
1
+ module.exports = require('@expo/local-build-cache-provider');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo",
3
- "version": "55.0.0-canary-20260119-17896bf",
3
+ "version": "55.0.0-canary-20260120-bb71700",
4
4
  "description": "The Expo SDK",
5
5
  "main": "src/Expo.ts",
6
6
  "module": "src/Expo.ts",
@@ -40,6 +40,8 @@
40
40
  "fetch.d.ts",
41
41
  "fingerprint.js",
42
42
  "fingerprint.d.ts",
43
+ "local-build-cache-provider.js",
44
+ "local-build-cache-provider.d.ts",
43
45
  "react-native.config.js",
44
46
  "requiresExtraSetup.json",
45
47
  "tsconfig.base.json",
@@ -75,40 +77,44 @@
75
77
  "homepage": "https://github.com/expo/expo/tree/main/packages/expo",
76
78
  "dependencies": {
77
79
  "@babel/runtime": "^7.20.0",
78
- "@expo/cli": "54.1.0-canary-20260119-17896bf",
79
- "@expo/config": "12.0.14-canary-20260119-17896bf",
80
- "@expo/config-plugins": "54.0.5-canary-20260119-17896bf",
81
- "@expo/devtools": "0.1.9-canary-20260119-17896bf",
82
- "@expo/fingerprint": "0.15.5-canary-20260119-17896bf",
80
+ "@expo/cli": "55.0.0-canary-20260120-bb71700",
81
+ "@expo/config": "12.0.14-canary-20260120-bb71700",
82
+ "@expo/config-plugins": "54.1.0-canary-20260120-bb71700",
83
+ "@expo/devtools": "0.1.9-canary-20260120-bb71700",
84
+ "@expo/fingerprint": "0.15.5-canary-20260120-bb71700",
85
+ "@expo/local-build-cache-provider": "0.0.1-canary-20260120-bb71700",
83
86
  "@expo/metro": "~54.2.0",
84
- "@expo/metro-config": "54.0.14-canary-20260119-17896bf",
85
- "@expo/vector-icons": "^15.0.3",
87
+ "@expo/metro-config": "54.1.0-canary-20260120-bb71700",
88
+ "@expo/vector-icons": "^15.0.2",
89
+ "@expo/log-box": "0.0.13-canary-20260120-bb71700",
86
90
  "@ungap/structured-clone": "^1.3.0",
87
- "babel-preset-expo": "54.0.10-canary-20260119-17896bf",
88
- "expo-asset": "12.0.13-canary-20260119-17896bf",
89
- "expo-constants": "18.0.14-canary-20260119-17896bf",
90
- "expo-file-system": "19.0.22-canary-20260119-17896bf",
91
- "expo-font": "14.0.11-canary-20260119-17896bf",
92
- "expo-keep-awake": "15.0.9-canary-20260119-17896bf",
93
- "expo-modules-autolinking": "3.0.25-canary-20260119-17896bf",
94
- "expo-modules-core": "3.0.30-canary-20260119-17896bf",
91
+ "babel-preset-expo": "54.1.0-canary-20260120-bb71700",
92
+ "expo-asset": "12.0.13-canary-20260120-bb71700",
93
+ "expo-constants": "18.1.0-canary-20260120-bb71700",
94
+ "expo-file-system": "19.0.22-canary-20260120-bb71700",
95
+ "expo-font": "14.1.0-canary-20260120-bb71700",
96
+ "expo-keep-awake": "15.0.9-canary-20260120-bb71700",
97
+ "expo-modules-autolinking": "3.1.0-canary-20260120-bb71700",
98
+ "expo-modules-core": "4.0.0-canary-20260120-bb71700",
95
99
  "pretty-format": "^29.7.0",
96
100
  "react-refresh": "^0.14.2",
97
101
  "whatwg-url-without-unicode": "8.0.0-3"
98
102
  },
99
103
  "devDependencies": {
104
+ "@expo/dom-webview": "0.2.9-canary-20260120-bb71700",
105
+ "@expo/metro-runtime": "6.2.0-canary-20260120-bb71700",
100
106
  "@types/node": "^22.14.0",
101
- "@types/react": "~19.1.10",
107
+ "@types/react": "~19.2.0",
102
108
  "@types/react-test-renderer": "~19.1.0",
103
- "expo-module-scripts": "5.0.9-canary-20260119-17896bf",
104
- "react": "19.1.0",
105
- "react-dom": "19.1.0",
106
- "react-native": "0.81.5",
109
+ "expo-module-scripts": "5.1.0-canary-20260120-bb71700",
110
+ "react": "19.2.0",
111
+ "react-dom": "19.2.0",
112
+ "react-native": "0.83.1",
107
113
  "web-streams-polyfill": "^3.3.2"
108
114
  },
109
115
  "peerDependencies": {
110
- "@expo/dom-webview": "0.2.9-canary-20260119-17896bf",
111
- "@expo/metro-runtime": "6.1.3-canary-20260119-17896bf",
116
+ "@expo/dom-webview": "0.2.9-canary-20260120-bb71700",
117
+ "@expo/metro-runtime": "6.2.0-canary-20260120-bb71700",
112
118
  "react": "*",
113
119
  "react-native": "*",
114
120
  "react-native-webview": "*"