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.
- package/Expo.podspec +1 -0
- package/android/build.gradle +5 -5
- package/android/src/main/java/expo/modules/ExpoReactHostFactory.kt +67 -32
- package/android/src/main/java/expo/modules/ReactActivityDelegateWrapper.kt +6 -9
- package/android/src/main/java/expo/modules/fetch/ExpoFetchModule.kt +4 -3
- package/android/src/main/java/expo/modules/fetch/NativeResponse.kt +3 -3
- package/android/src/main/java/expo/modules/fetch/ResponseSink.kt +7 -3
- package/android/src/test/java/expo/modules/ReactActivityDelegateWrapperDelayLoadTest.kt +2 -3
- package/build/Expo.d.ts +1 -1
- package/build/Expo.d.ts.map +1 -1
- package/build/async-require/buildErrors.d.ts +5 -0
- package/build/async-require/buildErrors.d.ts.map +1 -0
- package/build/async-require/getDevServer.d.ts.map +1 -1
- package/build/async-require/getFullBundlerUrl.d.ts +2 -0
- package/build/async-require/getFullBundlerUrl.d.ts.map +1 -0
- package/build/async-require/hmr.d.ts +8 -8
- package/build/async-require/hmr.d.ts.map +1 -1
- package/build/async-require/hmrUtils.d.ts +13 -0
- package/build/async-require/hmrUtils.d.ts.map +1 -0
- package/build/async-require/hmrUtils.native.d.ts +13 -0
- package/build/async-require/hmrUtils.native.d.ts.map +1 -0
- package/build/dom/dom-entry.d.ts.map +1 -1
- package/build/dom/dom-internal.types.d.ts +11 -0
- package/build/dom/dom-internal.types.d.ts.map +1 -0
- package/build/dom/dom.types.d.ts +5 -0
- package/build/dom/dom.types.d.ts.map +1 -1
- package/build/dom/internal.d.ts +1 -0
- package/build/dom/internal.d.ts.map +1 -1
- package/build/dom/webview-wrapper.d.ts +2 -2
- package/build/dom/webview-wrapper.d.ts.map +1 -1
- package/build/hooks/useEvent.d.ts +2 -2
- package/bundledNativeModules.json +99 -101
- package/ios/AppDelegates/AppDelegatesLoaderDelegate.swift +2 -0
- package/ios/AppDelegates/EXReactRootViewFactory.h +8 -1
- package/ios/AppDelegates/EXReactRootViewFactory.mm +26 -0
- package/ios/AppDelegates/ExpoAppDelegate.swift +14 -55
- package/ios/AppDelegates/ExpoReactNativeFactory.h +12 -0
- package/ios/AppDelegates/ExpoReactNativeFactory.mm +45 -0
- package/ios/AppDelegates/ExpoReactNativeFactory.swift +22 -1
- package/ios/Expo.h +2 -1
- package/ios/Fetch/ExpoFetchModule.swift +2 -2
- package/local-build-cache-provider.d.ts +1 -0
- package/local-build-cache-provider.js +1 -0
- package/package.json +29 -23
- package/src/Expo.fx.tsx +1 -25
- package/src/Expo.fx.web.tsx +2 -2
- package/src/Expo.ts +3 -0
- package/src/__tests__/__fbBatchedBridgeConfig-test.ts +7 -3
- package/src/async-require/asyncRequireModule.ts +2 -2
- package/src/async-require/buildErrors.ts +14 -0
- package/src/async-require/getDevServer.ts +3 -9
- package/src/async-require/getFullBundlerUrl.ts +13 -0
- package/src/async-require/hmr.ts +118 -103
- package/src/async-require/hmrUtils.native.ts +97 -0
- package/src/async-require/hmrUtils.ts +54 -0
- package/src/async-require/index.ts +1 -1
- package/src/async-require/setupFastRefresh.ts +3 -2
- package/src/dom/dom-entry.tsx +15 -8
- package/src/dom/dom-internal.types.ts +9 -0
- package/src/dom/dom.types.ts +6 -0
- package/src/dom/internal.ts +2 -0
- package/src/dom/webview-wrapper.tsx +14 -6
- package/src/hooks/useEvent.ts +2 -2
- package/template.tgz +0 -0
- package/types/react-native-web.d.ts +1 -1
- package/android/src/main/java/expo/modules/ReactNativeHostWrapper.kt +0 -51
- package/android/src/main/java/expo/modules/ReactNativeHostWrapperBase.kt +0 -107
- package/build/async-require/hmr.native.d.ts +0 -3
- package/build/async-require/hmr.native.d.ts.map +0 -1
- package/ios/AppDelegates/EXAppDelegateWrapper.h +0 -30
- package/ios/AppDelegates/EXAppDelegateWrapper.mm +0 -112
- package/src/async-require/hmr.native.ts +0 -3
|
@@ -1,120 +1,118 @@
|
|
|
1
1
|
{
|
|
2
|
-
"@expo/fingerprint": "0.15.5-canary-
|
|
3
|
-
"@expo/metro-runtime": "6.
|
|
4
|
-
"@expo/vector-icons": "^15.0.
|
|
5
|
-
"@expo/ui": "0.2.0-canary-
|
|
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.
|
|
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.
|
|
10
|
+
"@react-native-community/slider": "5.1.1",
|
|
11
11
|
"@react-native-community/viewpager": "5.0.11",
|
|
12
|
-
"@react-native-picker/picker": "2.11.
|
|
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.
|
|
15
|
-
"eslint-config-expo": "10.0.1-canary-
|
|
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-
|
|
21
|
-
"expo-application": "7.0.9-canary-
|
|
22
|
-
"expo-asset": "12.0.13-canary-
|
|
23
|
-
"expo-audio": "1.
|
|
24
|
-
"expo-auth-session": "7.0
|
|
25
|
-
"expo-
|
|
26
|
-
"expo-background-
|
|
27
|
-
"expo-
|
|
28
|
-
"expo-
|
|
29
|
-
"expo-
|
|
30
|
-
"expo-
|
|
31
|
-
"expo-
|
|
32
|
-
"expo-
|
|
33
|
-
"expo-
|
|
34
|
-
"expo-
|
|
35
|
-
"expo-
|
|
36
|
-
"expo-
|
|
37
|
-
"expo-
|
|
38
|
-
"expo-
|
|
39
|
-
"expo-
|
|
40
|
-
"expo-
|
|
41
|
-
"expo-
|
|
42
|
-
"expo-
|
|
43
|
-
"expo-
|
|
44
|
-
"expo-
|
|
45
|
-
"expo-
|
|
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-
|
|
49
|
-
"expo-image": "3.0
|
|
50
|
-
"expo-image-loader": "
|
|
51
|
-
"expo-image-manipulator": "14.0.9-canary-
|
|
52
|
-
"expo-image-picker": "17.0
|
|
53
|
-
"expo-intent-launcher": "13.0.9-canary-
|
|
54
|
-
"expo-insights": "0.10.9-canary-
|
|
55
|
-
"expo-keep-awake": "15.0.9-canary-
|
|
56
|
-
"expo-linear-gradient": "15.0.9-canary-
|
|
57
|
-
"expo-linking": "8.0.12-canary-
|
|
58
|
-
"expo-local-authentication": "17.0.9-canary-
|
|
59
|
-
"expo-localization": "
|
|
60
|
-
"expo-location": "19.0
|
|
61
|
-
"expo-mail-composer": "15.0.9-canary-
|
|
62
|
-
"expo-manifests": "1.0.11-canary-
|
|
63
|
-
"expo-maps": "0.
|
|
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.
|
|
66
|
-
"expo-mesh-gradient": "0.4.9-canary-
|
|
67
|
-
"expo-module-template": "11.0.19-canary-
|
|
68
|
-
"expo-modules-core": "
|
|
69
|
-
"expo-navigation-bar": "5.0.11-canary-
|
|
70
|
-
"expo-network": "8.0.9-canary-
|
|
71
|
-
"expo-notifications": "0.
|
|
72
|
-
"expo-print": "15.0.9-canary-
|
|
73
|
-
"expo-live-photo": "1.0.9-canary-
|
|
74
|
-
"expo-router": "
|
|
75
|
-
"expo-screen-capture": "8.0.10-canary-
|
|
76
|
-
"expo-screen-orientation": "9.0.9-canary-
|
|
77
|
-
"expo-secure-store": "15.0.9-canary-
|
|
78
|
-
"expo-sensors": "15.0.9-canary-
|
|
79
|
-
"expo-server": "1.0
|
|
80
|
-
"expo-sharing": "14.0.9-canary-
|
|
81
|
-
"expo-sms": "14.0.9-canary-
|
|
82
|
-
"expo-speech": "14.0
|
|
83
|
-
"expo-splash-screen": "31.0.14-canary-
|
|
84
|
-
"expo-sqlite": "16.0
|
|
85
|
-
"expo-status-bar": "3.0.10-canary-
|
|
86
|
-
"expo-store-review": "9.0.10-canary-
|
|
87
|
-
"expo-symbols": "1.0
|
|
88
|
-
"expo-system-ui": "6.0.10-canary-
|
|
89
|
-
"expo-task-manager": "14.0.10-canary-
|
|
90
|
-
"expo-tracking-transparency": "6.0.9-canary-
|
|
91
|
-
"expo-updates": "29.0
|
|
92
|
-
"expo-video-thumbnails": "10.0.9-canary-
|
|
93
|
-
"expo-video": "
|
|
94
|
-
"expo-web-browser": "15.0.11-canary-
|
|
95
|
-
"jest-expo": "55.0.0-canary-
|
|
96
|
-
"lottie-react-native": "~7.3.
|
|
97
|
-
"react": "19.
|
|
98
|
-
"react-dom": "19.
|
|
99
|
-
"react-native": "0.
|
|
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.
|
|
99
|
+
"react-native-gesture-handler": "~2.30.0",
|
|
102
100
|
"react-native-get-random-values": "~1.11.0",
|
|
103
|
-
"react-native-keyboard-controller": "1.
|
|
104
|
-
"react-native-maps": "1.20
|
|
105
|
-
"react-native-pager-view": "
|
|
106
|
-
"react-native-worklets": "0.
|
|
107
|
-
"react-native-reanimated": "~4.
|
|
108
|
-
"react-native-screens": "~4.
|
|
109
|
-
"react-native-safe-area-context": "~5.6.
|
|
110
|
-
"react-native-svg": "15.
|
|
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.
|
|
113
|
-
"react-server-dom-webpack": "~19.
|
|
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-
|
|
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.
|
|
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"
|
|
@@ -15,7 +15,7 @@ NS_SWIFT_NAME(ExpoReactRootViewFactory)
|
|
|
15
15
|
@property (nonatomic, weak, nullable) EXReactDelegate *reactDelegate;
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
Initializer for
|
|
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,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
@preconcurrency import ExpoModulesCore
|
|
4
4
|
|
|
5
5
|
private let fetchRequestQueue = DispatchQueue(label: "expo.modules.fetch.RequestQueue")
|
|
6
|
-
|
|
6
|
+
nonisolated(unsafe) internal var urlSessionConfigurationProvider: NSURLSessionConfigurationProvider?
|
|
7
7
|
|
|
8
|
-
|
|
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-
|
|
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": "
|
|
79
|
-
"@expo/config": "12.0.14-canary-
|
|
80
|
-
"@expo/config-plugins": "54.0
|
|
81
|
-
"@expo/devtools": "0.1.9-canary-
|
|
82
|
-
"@expo/fingerprint": "0.15.5-canary-
|
|
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
|
|
85
|
-
"@expo/vector-icons": "^15.0.
|
|
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
|
|
88
|
-
"expo-asset": "12.0.13-canary-
|
|
89
|
-
"expo-constants": "18.0
|
|
90
|
-
"expo-file-system": "19.0.22-canary-
|
|
91
|
-
"expo-font": "14.0
|
|
92
|
-
"expo-keep-awake": "15.0.9-canary-
|
|
93
|
-
"expo-modules-autolinking": "3.0
|
|
94
|
-
"expo-modules-core": "
|
|
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.
|
|
107
|
+
"@types/react": "~19.2.0",
|
|
102
108
|
"@types/react-test-renderer": "~19.1.0",
|
|
103
|
-
"expo-module-scripts": "5.0
|
|
104
|
-
"react": "19.
|
|
105
|
-
"react-dom": "19.
|
|
106
|
-
"react-native": "0.
|
|
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-
|
|
111
|
-
"@expo/metro-runtime": "6.
|
|
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": "*"
|