expo 55.0.0-canary-20251023-4c86f95 → 55.0.0-canary-20251031-b135dff

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-20251023-4c86f95'
35
+ version = '55.0.0-canary-20251031-b135dff'
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-20251023-4c86f95"
46
+ versionName "55.0.0-canary-20251031-b135dff"
47
47
  consumerProguardFiles("proguard-rules.pro")
48
48
  }
49
49
  testOptions {
@@ -24,3 +24,8 @@
24
24
 
25
25
  -keepnames class * extends expo.modules.core.BasePackage
26
26
  -keepnames class * implements expo.modules.core.interfaces.Package
27
+
28
+ # For React Native WindowUtilKt edge-to-edge support
29
+ -keep class com.facebook.react.views.view.WindowUtilKt {
30
+ *;
31
+ }
@@ -65,7 +65,8 @@ object ExpoReactHostFactory {
65
65
  if (backingJSBundleLoader != null) {
66
66
  return backingJSBundleLoader
67
67
  }
68
- val context = weakContext.get() ?: throw IllegalStateException("Unable to get concrete Context")
68
+ val context = weakContext.get()
69
+ ?: throw IllegalStateException("Unable to get concrete Context")
69
70
  hostDelegateJsBundleFilePath?.let { jsBundleFile ->
70
71
  if (jsBundleFile.startsWith("assets://")) {
71
72
  return JSBundleLoader.createAssetLoader(context, jsBundleFile, true)
@@ -128,12 +129,14 @@ object ExpoReactHostFactory {
128
129
  val reactHostImpl =
129
130
  ReactHostImpl(
130
131
  context,
131
- reactHostDelegate,
132
- componentFactory,
133
- true,
134
- useDevSupport
132
+ delegate = reactHostDelegate,
133
+ componentFactory = componentFactory,
134
+ allowPackagerServerAccess = true,
135
+ useDevSupport = useDevSupport
135
136
  )
137
+
136
138
  hostHandlers.forEach { handler ->
139
+ handler.onDidCreateReactHost(context, reactHostImpl)
137
140
  handler.onDidCreateDevSupportManager(reactHostImpl.devSupportManager)
138
141
  }
139
142
 
@@ -123,6 +123,11 @@ class ReactActivityDelegateWrapper(
123
123
  val newDelegate = reactActivityHandlers.asSequence()
124
124
  .mapNotNull { it.onDidCreateReactActivityDelegate(activity, this) }
125
125
  .firstOrNull()
126
+
127
+ reactActivityHandlers.forEach { handler ->
128
+ handler.onDidCreateReactActivityDelegateNotification(activity, newDelegate)
129
+ }
130
+
126
131
  if (newDelegate != null && newDelegate != this) {
127
132
  val mDelegateField = ReactActivity::class.java.getDeclaredField("mDelegate")
128
133
  mDelegateField.isAccessible = true
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Copyright © 2025 650 Industries.
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ *
8
+ * This is added as `asyncRequireModulePath` in `@expo/metro-config`
9
+ * Fork of https://github.com/facebook/metro/blob/b8e9e64f1de97a67234e223f5ee21524b160e8a5/packages/metro-runtime/src/modules/asyncRequire.js#L1
10
+ * - Adds worker support.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=asyncRequireModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncRequireModule.d.ts","sourceRoot":"","sources":["../../src/async-require/asyncRequireModule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -1 +1 @@
1
- {"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../src/async-require/hmr.ts"],"names":[],"mappings":"AAiCA,KAAK,QAAQ,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,KAAK,GACL,OAAO,GACP,gBAAgB,GAChB,UAAU,GACV,OAAO,CAAC;AAMZ;;;GAGG;AACH,QAAA,MAAM,SAAS;;;+BAyCc,MAAM;eAMtB,QAAQ,QAAQ,GAAG,EAAE;6BA8CX,MAAM,GAAG;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,gBACpC,MAAM,SACb,MAAM,SACN,MAAM,GAAG,MAAM,yBACC,OAAO,WACtB,MAAM;yBA2GK,OAAO;CA4B7B,CAAC;AAyDF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../src/async-require/hmr.ts"],"names":[],"mappings":"AAiCA,KAAK,QAAQ,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,KAAK,GACL,OAAO,GACP,gBAAgB,GAChB,UAAU,GACV,OAAO,CAAC;AAMZ;;;GAGG;AACH,QAAA,MAAM,SAAS;;;+BAyCc,MAAM;eAMtB,QAAQ,QAAQ,GAAG,EAAE;6BA8CX,MAAM,GAAG;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,gBACpC,MAAM,SACb,MAAM,SACN,MAAM,GAAG,MAAM,yBACC,OAAO,WACtB,MAAM;yBA0HK,OAAO;CA4B7B,CAAC;AAyDF,eAAe,SAAS,CAAC"}
@@ -1,8 +1,8 @@
1
1
  {
2
- "@expo/fingerprint": "0.15.3-canary-20251023-4c86f95",
3
- "@expo/metro-runtime": "6.1.3-canary-20251023-4c86f95",
2
+ "@expo/fingerprint": "0.15.3-canary-20251031-b135dff",
3
+ "@expo/metro-runtime": "6.2.0-canary-20251031-b135dff",
4
4
  "@expo/vector-icons": "^15.0.2",
5
- "@expo/ui": "0.2.0-canary-20251023-4c86f95",
5
+ "@expo/ui": "0.2.0-canary-20251031-b135dff",
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",
@@ -12,85 +12,86 @@
12
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-20251023-4c86f95",
15
+ "eslint-config-expo": "10.0.1-canary-20251031-b135dff",
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-20251023-4c86f95",
20
- "expo-application": "7.0.8-canary-20251023-4c86f95",
21
- "expo-asset": "12.0.10-canary-20251023-4c86f95",
22
- "expo-audio": "1.1.0-canary-20251023-4c86f95",
23
- "expo-auth-session": "7.0.9-canary-20251023-4c86f95",
24
- "expo-av": "16.0.8-canary-20251023-4c86f95",
25
- "expo-background-fetch": "14.0.8-canary-20251023-4c86f95",
26
- "expo-background-task": "1.0.9-canary-20251023-4c86f95",
27
- "expo-battery": "10.0.8-canary-20251023-4c86f95",
28
- "expo-blur": "16.0.0-canary-20251023-4c86f95",
29
- "expo-brightness": "15.0.0-canary-20251023-4c86f95",
30
- "expo-build-properties": "1.0.10-canary-20251023-4c86f95",
31
- "expo-calendar": "15.0.8-canary-20251023-4c86f95",
32
- "expo-camera": "17.1.0-canary-20251023-4c86f95",
33
- "expo-cellular": "8.0.8-canary-20251023-4c86f95",
34
- "expo-checkbox": "5.0.8-canary-20251023-4c86f95",
35
- "expo-clipboard": "8.0.8-canary-20251023-4c86f95",
36
- "expo-constants": "18.0.11-canary-20251023-4c86f95",
37
- "expo-contacts": "15.0.11-canary-20251023-4c86f95",
38
- "expo-crypto": "15.0.8-canary-20251023-4c86f95",
39
- "expo-dev-client": "6.0.17-canary-20251023-4c86f95",
40
- "expo-device": "8.0.10-canary-20251023-4c86f95",
41
- "expo-document-picker": "14.0.8-canary-20251023-4c86f95",
42
- "expo-file-system": "19.1.0-canary-20251023-4c86f95",
43
- "expo-font": "14.0.10-canary-20251023-4c86f95",
44
- "expo-gl": "16.0.8-canary-20251023-4c86f95",
45
- "expo-glass-effect": "0.1.5-canary-20251023-4c86f95",
19
+ "expo-apple-authentication": "8.0.8-canary-20251031-b135dff",
20
+ "expo-application": "7.0.8-canary-20251031-b135dff",
21
+ "expo-asset": "12.0.10-canary-20251031-b135dff",
22
+ "expo-audio": "1.1.0-canary-20251031-b135dff",
23
+ "expo-auth-session": "7.0.9-canary-20251031-b135dff",
24
+ "expo-av": "16.0.8-canary-20251031-b135dff",
25
+ "expo-background-fetch": "14.0.8-canary-20251031-b135dff",
26
+ "expo-background-task": "1.0.9-canary-20251031-b135dff",
27
+ "expo-battery": "10.0.8-canary-20251031-b135dff",
28
+ "expo-blur": "16.0.0-canary-20251031-b135dff",
29
+ "expo-brightness": "15.0.0-canary-20251031-b135dff",
30
+ "expo-build-properties": "1.0.10-canary-20251031-b135dff",
31
+ "expo-calendar": "15.1.0-canary-20251031-b135dff",
32
+ "expo-camera": "17.1.0-canary-20251031-b135dff",
33
+ "expo-cellular": "8.0.8-canary-20251031-b135dff",
34
+ "expo-checkbox": "5.0.8-canary-20251031-b135dff",
35
+ "expo-clipboard": "8.0.8-canary-20251031-b135dff",
36
+ "expo-constants": "18.1.0-canary-20251031-b135dff",
37
+ "expo-contacts": "15.0.11-canary-20251031-b135dff",
38
+ "expo-crypto": "15.0.8-canary-20251031-b135dff",
39
+ "expo-dev-client": "6.0.17-canary-20251031-b135dff",
40
+ "expo-device": "8.0.10-canary-20251031-b135dff",
41
+ "expo-document-picker": "14.0.8-canary-20251031-b135dff",
42
+ "expo-file-system": "19.1.0-canary-20251031-b135dff",
43
+ "expo-font": "14.0.10-canary-20251031-b135dff",
44
+ "expo-gl": "16.0.8-canary-20251031-b135dff",
45
+ "expo-glass-effect": "0.2.0-canary-20251031-b135dff",
46
46
  "expo-google-app-auth": "~8.3.0",
47
- "expo-haptics": "15.0.8-canary-20251023-4c86f95",
48
- "expo-image": "3.1.0-canary-20251023-4c86f95",
49
- "expo-image-loader": "6.0.1-canary-20251023-4c86f95",
50
- "expo-image-manipulator": "14.0.8-canary-20251023-4c86f95",
51
- "expo-image-picker": "17.0.9-canary-20251023-4c86f95",
52
- "expo-intent-launcher": "13.0.8-canary-20251023-4c86f95",
53
- "expo-insights": "0.10.8-canary-20251023-4c86f95",
54
- "expo-keep-awake": "15.0.8-canary-20251023-4c86f95",
55
- "expo-linear-gradient": "15.0.8-canary-20251023-4c86f95",
56
- "expo-linking": "8.0.9-canary-20251023-4c86f95",
57
- "expo-local-authentication": "17.0.8-canary-20251023-4c86f95",
58
- "expo-localization": "17.0.8-canary-20251023-4c86f95",
59
- "expo-location": "19.0.8-canary-20251023-4c86f95",
60
- "expo-mail-composer": "15.0.8-canary-20251023-4c86f95",
61
- "expo-manifests": "1.0.9-canary-20251023-4c86f95",
62
- "expo-maps": "0.12.9-canary-20251023-4c86f95",
63
- "expo-media-library": "18.3.0-canary-20251023-4c86f95",
64
- "expo-mesh-gradient": "0.4.8-canary-20251023-4c86f95",
65
- "expo-module-template": "11.0.17-canary-20251023-4c86f95",
66
- "expo-modules-core": "3.1.0-canary-20251023-4c86f95",
67
- "expo-navigation-bar": "5.0.10-canary-20251023-4c86f95",
68
- "expo-network": "8.0.8-canary-20251023-4c86f95",
69
- "expo-notifications": "1.0.0-canary-20251023-4c86f95",
70
- "expo-print": "15.0.8-canary-20251023-4c86f95",
71
- "expo-live-photo": "1.0.8-canary-20251023-4c86f95",
72
- "expo-router": "7.0.0-canary-20251023-4c86f95",
73
- "expo-screen-capture": "8.0.9-canary-20251023-4c86f95",
74
- "expo-screen-orientation": "9.0.8-canary-20251023-4c86f95",
75
- "expo-secure-store": "15.0.8-canary-20251023-4c86f95",
76
- "expo-sensors": "15.0.8-canary-20251023-4c86f95",
77
- "expo-sharing": "14.0.8-canary-20251023-4c86f95",
78
- "expo-sms": "14.0.8-canary-20251023-4c86f95",
79
- "expo-speech": "14.0.8-canary-20251023-4c86f95",
80
- "expo-splash-screen": "31.0.11-canary-20251023-4c86f95",
81
- "expo-sqlite": "16.0.9-canary-20251023-4c86f95",
82
- "expo-status-bar": "3.0.9-canary-20251023-4c86f95",
83
- "expo-store-review": "9.0.9-canary-20251023-4c86f95",
84
- "expo-symbols": "1.1.0-canary-20251023-4c86f95",
85
- "expo-system-ui": "6.0.9-canary-20251023-4c86f95",
86
- "expo-task-manager": "14.0.9-canary-20251023-4c86f95",
87
- "expo-tracking-transparency": "6.0.8-canary-20251023-4c86f95",
88
- "expo-updates": "29.1.0-canary-20251023-4c86f95",
89
- "expo-video-thumbnails": "10.0.8-canary-20251023-4c86f95",
90
- "expo-video": "3.0.12-canary-20251023-4c86f95",
91
- "expo-web-browser": "15.0.9-canary-20251023-4c86f95",
92
- "jest-expo": "55.0.0-canary-20251023-4c86f95",
93
- "lottie-react-native": "~7.3.1",
47
+ "expo-haptics": "15.0.8-canary-20251031-b135dff",
48
+ "expo-image": "3.1.0-canary-20251031-b135dff",
49
+ "expo-image-loader": "6.0.1-canary-20251031-b135dff",
50
+ "expo-image-manipulator": "14.0.8-canary-20251031-b135dff",
51
+ "expo-image-picker": "17.1.0-canary-20251031-b135dff",
52
+ "expo-intent-launcher": "13.0.8-canary-20251031-b135dff",
53
+ "expo-insights": "0.10.8-canary-20251031-b135dff",
54
+ "expo-keep-awake": "15.0.8-canary-20251031-b135dff",
55
+ "expo-linear-gradient": "15.0.8-canary-20251031-b135dff",
56
+ "expo-linking": "8.0.9-canary-20251031-b135dff",
57
+ "expo-local-authentication": "17.0.8-canary-20251031-b135dff",
58
+ "expo-localization": "17.0.8-canary-20251031-b135dff",
59
+ "expo-location": "19.0.8-canary-20251031-b135dff",
60
+ "expo-mail-composer": "15.0.8-canary-20251031-b135dff",
61
+ "expo-manifests": "1.0.9-canary-20251031-b135dff",
62
+ "expo-maps": "0.12.9-canary-20251031-b135dff",
63
+ "expo-media-library": "18.3.0-canary-20251031-b135dff",
64
+ "expo-mesh-gradient": "0.4.8-canary-20251031-b135dff",
65
+ "expo-module-template": "11.0.17-canary-20251031-b135dff",
66
+ "expo-modules-core": "3.1.0-canary-20251031-b135dff",
67
+ "expo-navigation-bar": "5.0.10-canary-20251031-b135dff",
68
+ "expo-network": "8.0.8-canary-20251031-b135dff",
69
+ "expo-notifications": "1.0.0-canary-20251031-b135dff",
70
+ "expo-print": "15.0.8-canary-20251031-b135dff",
71
+ "expo-live-photo": "1.0.8-canary-20251031-b135dff",
72
+ "expo-router": "7.0.0-canary-20251031-b135dff",
73
+ "expo-screen-capture": "8.0.9-canary-20251031-b135dff",
74
+ "expo-screen-orientation": "9.0.8-canary-20251031-b135dff",
75
+ "expo-secure-store": "15.0.8-canary-20251031-b135dff",
76
+ "expo-sensors": "15.0.8-canary-20251031-b135dff",
77
+ "expo-server": "1.0.4-canary-20251031-b135dff",
78
+ "expo-sharing": "14.0.8-canary-20251031-b135dff",
79
+ "expo-sms": "14.0.8-canary-20251031-b135dff",
80
+ "expo-speech": "14.0.8-canary-20251031-b135dff",
81
+ "expo-splash-screen": "31.0.11-canary-20251031-b135dff",
82
+ "expo-sqlite": "16.0.9-canary-20251031-b135dff",
83
+ "expo-status-bar": "3.0.9-canary-20251031-b135dff",
84
+ "expo-store-review": "9.0.9-canary-20251031-b135dff",
85
+ "expo-symbols": "1.1.0-canary-20251031-b135dff",
86
+ "expo-system-ui": "6.0.9-canary-20251031-b135dff",
87
+ "expo-task-manager": "14.0.9-canary-20251031-b135dff",
88
+ "expo-tracking-transparency": "6.0.8-canary-20251031-b135dff",
89
+ "expo-updates": "29.1.0-canary-20251031-b135dff",
90
+ "expo-video-thumbnails": "10.0.8-canary-20251031-b135dff",
91
+ "expo-video": "3.1.0-canary-20251031-b135dff",
92
+ "expo-web-browser": "15.0.9-canary-20251031-b135dff",
93
+ "jest-expo": "55.0.0-canary-20251031-b135dff",
94
+ "lottie-react-native": "~7.3.4",
94
95
  "react": "19.1.1",
95
96
  "react-dom": "19.1.1",
96
97
  "react-native": "0.82.1",
@@ -108,7 +109,7 @@
108
109
  "react-native-view-shot": "4.0.3",
109
110
  "react-native-webview": "13.15.0",
110
111
  "sentry-expo": "~7.0.0",
111
- "unimodules-app-loader": "6.0.8-canary-20251023-4c86f95",
112
+ "unimodules-app-loader": "6.0.8-canary-20251031-b135dff",
112
113
  "unimodules-image-loader-interface": "~6.1.0",
113
114
  "@shopify/react-native-skia": "2.2.12",
114
115
  "@shopify/flash-list": "2.0.2",
@@ -0,0 +1,2 @@
1
+ // WARN: Internal re-export, don't rely on this to be a public API
2
+ module.exports = require('../src/async-require/asyncRequireModule');
@@ -92,7 +92,15 @@ open class ExpoAppDelegate: NSObject, UIApplicationDelegate {
92
92
  }
93
93
  #endif
94
94
 
95
- // TODO: - Responding to Environment Changes
95
+ // MARK: - Responding to Environment Changes
96
+
97
+ #if os(iOS) || os(tvOS)
98
+
99
+ open func applicationDidReceiveMemoryWarning(_ application: UIApplication) {
100
+ ExpoAppDelegateSubscriberManager.applicationDidReceiveMemoryWarning(application)
101
+ }
102
+
103
+ #endif
96
104
 
97
105
  // TODO: - Managing App State Restoration
98
106
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo",
3
- "version": "55.0.0-canary-20251023-4c86f95",
3
+ "version": "55.0.0-canary-20251031-b135dff",
4
4
  "description": "The Expo SDK",
5
5
  "main": "src/Expo.ts",
6
6
  "module": "src/Expo.ts",
@@ -75,24 +75,24 @@
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.1.0-canary-20251023-4c86f95",
79
- "@expo/config": "12.0.11-canary-20251023-4c86f95",
80
- "@expo/config-plugins": "54.0.3-canary-20251023-4c86f95",
81
- "@expo/devtools": "0.1.8-canary-20251023-4c86f95",
82
- "@expo/fingerprint": "0.15.3-canary-20251023-4c86f95",
78
+ "@expo/cli": "54.1.0-canary-20251031-b135dff",
79
+ "@expo/config": "12.0.11-canary-20251031-b135dff",
80
+ "@expo/config-plugins": "54.0.3-canary-20251031-b135dff",
81
+ "@expo/devtools": "0.1.8-canary-20251031-b135dff",
82
+ "@expo/fingerprint": "0.15.3-canary-20251031-b135dff",
83
83
  "@expo/metro": "~54.1.0",
84
- "@expo/metro-config": "54.0.8-canary-20251023-4c86f95",
84
+ "@expo/metro-config": "54.0.9-canary-20251031-b135dff",
85
85
  "@expo/vector-icons": "^15.0.2",
86
- "@expo/log-box": "0.0.13-canary-20251023-4c86f95",
86
+ "@expo/log-box": "0.0.13-canary-20251031-b135dff",
87
87
  "@ungap/structured-clone": "^1.3.0",
88
- "babel-preset-expo": "54.0.7-canary-20251023-4c86f95",
89
- "expo-asset": "12.0.10-canary-20251023-4c86f95",
90
- "expo-constants": "18.0.11-canary-20251023-4c86f95",
91
- "expo-file-system": "19.1.0-canary-20251023-4c86f95",
92
- "expo-font": "14.0.10-canary-20251023-4c86f95",
93
- "expo-keep-awake": "15.0.8-canary-20251023-4c86f95",
94
- "expo-modules-autolinking": "3.1.0-canary-20251023-4c86f95",
95
- "expo-modules-core": "3.1.0-canary-20251023-4c86f95",
88
+ "babel-preset-expo": "54.0.7-canary-20251031-b135dff",
89
+ "expo-asset": "12.0.10-canary-20251031-b135dff",
90
+ "expo-constants": "18.1.0-canary-20251031-b135dff",
91
+ "expo-file-system": "19.1.0-canary-20251031-b135dff",
92
+ "expo-font": "14.0.10-canary-20251031-b135dff",
93
+ "expo-keep-awake": "15.0.8-canary-20251031-b135dff",
94
+ "expo-modules-autolinking": "3.1.0-canary-20251031-b135dff",
95
+ "expo-modules-core": "3.1.0-canary-20251031-b135dff",
96
96
  "pretty-format": "^29.7.0",
97
97
  "react-refresh": "^0.14.2",
98
98
  "whatwg-url-without-unicode": "8.0.0-3"
@@ -101,15 +101,15 @@
101
101
  "@types/node": "^22.14.0",
102
102
  "@types/react": "~19.1.10",
103
103
  "@types/react-test-renderer": "~19.1.0",
104
- "expo-module-scripts": "5.0.8-canary-20251023-4c86f95",
104
+ "expo-module-scripts": "5.0.8-canary-20251031-b135dff",
105
105
  "react": "19.1.1",
106
106
  "react-dom": "19.1.1",
107
107
  "react-native": "0.82.1",
108
108
  "web-streams-polyfill": "^3.3.2"
109
109
  },
110
110
  "peerDependencies": {
111
- "@expo/dom-webview": "0.2.8-canary-20251023-4c86f95",
112
- "@expo/metro-runtime": "6.1.3-canary-20251023-4c86f95",
111
+ "@expo/dom-webview": "0.2.8-canary-20251031-b135dff",
112
+ "@expo/metro-runtime": "6.2.0-canary-20251031-b135dff",
113
113
  "react": "*",
114
114
  "react-native": "*",
115
115
  "react-native-webview": "*"
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Copyright © 2025 650 Industries.
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ *
8
+ * This is added as `asyncRequireModulePath` in `@expo/metro-config`
9
+ * Fork of https://github.com/facebook/metro/blob/b8e9e64f1de97a67234e223f5ee21524b160e8a5/packages/metro-runtime/src/modules/asyncRequire.js#L1
10
+ * - Adds worker support.
11
+ */
12
+
13
+ type MetroRequire = {
14
+ (id: number): unknown;
15
+ importAll: <T>(id: number) => T;
16
+ };
17
+
18
+ type DependencyMapPaths = { [moduleID: number | string]: unknown } | null;
19
+
20
+ declare let __METRO_GLOBAL_PREFIX__: string;
21
+
22
+ function maybeLoadBundle(moduleID: number, paths: DependencyMapPaths): void | Promise<void> {
23
+ const loadBundle: (bundlePath: unknown) => Promise<void> = (global as any)[
24
+ `${__METRO_GLOBAL_PREFIX__}__loadBundleAsync`
25
+ ];
26
+
27
+ if (loadBundle != null) {
28
+ const stringModuleID = String(moduleID);
29
+ if (paths != null) {
30
+ const bundlePath = paths[stringModuleID];
31
+ if (bundlePath != null) {
32
+ // NOTE: Errors will be swallowed by asyncRequire.prefetch
33
+ return loadBundle(bundlePath);
34
+ }
35
+ }
36
+ }
37
+
38
+ return undefined;
39
+ }
40
+
41
+ function asyncRequireImpl<T>(moduleID: number, paths: DependencyMapPaths): Promise<T> | T {
42
+ const maybeLoadBundlePromise = maybeLoadBundle(moduleID, paths);
43
+ const importAll = () => (require as unknown as MetroRequire).importAll<T>(moduleID);
44
+
45
+ if (maybeLoadBundlePromise != null) {
46
+ return maybeLoadBundlePromise.then(importAll);
47
+ }
48
+
49
+ return importAll();
50
+ }
51
+
52
+ async function asyncRequire<T>(
53
+ moduleID: number,
54
+ paths: DependencyMapPaths,
55
+ moduleName?: string // unused
56
+ ): Promise<T> {
57
+ return asyncRequireImpl<T>(moduleID, paths);
58
+ }
59
+
60
+ // Synchronous version of asyncRequire, which can still return a promise
61
+ // if the module is split.
62
+ asyncRequire.unstable_importMaybeSync = function unstable_importMaybeSync<T>(
63
+ moduleID: number,
64
+ paths: DependencyMapPaths
65
+ ): Promise<T> | T {
66
+ return asyncRequireImpl(moduleID, paths);
67
+ };
68
+
69
+ asyncRequire.prefetch = function (
70
+ moduleID: number,
71
+ paths: DependencyMapPaths,
72
+ moduleName?: string // unused
73
+ ): void {
74
+ maybeLoadBundle(moduleID, paths)?.then(
75
+ () => {},
76
+ () => {}
77
+ );
78
+ };
79
+
80
+ asyncRequire.unstable_resolve = function unstable_resolve(
81
+ moduleID: number,
82
+ paths: DependencyMapPaths
83
+ ) {
84
+ if (!paths) {
85
+ throw new Error('Bundle splitting is required for Web Worker imports');
86
+ }
87
+ const id = paths[moduleID];
88
+ if (!id) {
89
+ throw new Error('Worker import is missing from split bundle paths: ' + id);
90
+ }
91
+ return id;
92
+ };
93
+
94
+ // TODO(@kitten): Missing metro type definitions
95
+ declare const module: any;
96
+
97
+ module.exports = asyncRequire;
@@ -206,11 +206,26 @@ const HMRClient = {
206
206
  }
207
207
  });
208
208
 
209
- client.on('update', ({ isInitialUpdate }: { isInitialUpdate?: boolean }) => {
210
- if (client.isEnabled() && !isInitialUpdate) {
211
- resetErrorOverlay();
209
+ client.on(
210
+ 'update',
211
+ ({
212
+ isInitialUpdate,
213
+ added,
214
+ modified,
215
+ deleted,
216
+ }: {
217
+ isInitialUpdate?: boolean;
218
+ added: unknown[];
219
+ modified: unknown[];
220
+ deleted: unknown[];
221
+ }) => {
222
+ // NOTE(@krystofwoldrich): I don't know why sometimes empty updates are sent. But they should not reset the overlay.
223
+ const isEmpty = added.length === 0 && modified.length === 0 && deleted.length === 0;
224
+ if (client.isEnabled() && !isInitialUpdate && !isEmpty) {
225
+ resetErrorOverlay();
226
+ }
212
227
  }
213
- });
228
+ );
214
229
 
215
230
  client.on('update-done', () => {
216
231
  hideLoading();
@@ -27,8 +27,14 @@ describe('getBaseURL', () => {
27
27
  isEnabled: true,
28
28
  isEmbeddedLaunch: false,
29
29
  localAssets: {
30
+ '8d4e297c3b3e49a614248143d53e40ca':
31
+ 'file:///android_res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png',
32
+ '4403c6117ec30c859bc95d70ce4a71d3':
33
+ 'file:///android_res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png',
30
34
  '5d41402abc4b2a76b9719d911017c592':
31
35
  'file:///path/to/.expo-internal/5d41402abc4b2a76b9719d911017c592.png',
36
+ '1d1ea1496f9057eb392d5bbf3732a61b7':
37
+ 'file:///android_res/drawable/node_modules_exporouter_assets_error.png',
32
38
  },
33
39
  },
34
40
  },
@@ -45,8 +51,15 @@ describe('getBaseURL', () => {
45
51
  isEnabled: true,
46
52
  isEmbeddedLaunch: true,
47
53
  localAssets: {
54
+ '8d4e297c3b3e49a614248143d53e40ca':
55
+ 'file:///android_res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png',
56
+ '4403c6117ec30c859bc95d70ce4a71d3':
57
+ 'file:///android_res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png',
58
+
48
59
  '5d41402abc4b2a76b9719d911017c592':
49
60
  'file:///path/to/.expo-internal/5d41402abc4b2a76b9719d911017c592.png',
61
+ '1d1ea1496f9057eb392d5bbf3732a61b7':
62
+ 'file:///android_res/drawable/node_modules_exporouter_assets_error.png',
50
63
  },
51
64
  },
52
65
  },
package/src/dom/base.ts CHANGED
@@ -52,7 +52,10 @@ function getUpdatesBaseURL(): string | null {
52
52
  // If updates is installed and enabled, and we're not running from an embedded launch, we should serve the DOM Components from the `.expo-internal` directory
53
53
  if (shouldServeDomFromUpdates) {
54
54
  const localAssets = ExpoUpdates?.localAssets ?? {};
55
- const anyLocalAsset = Object.values(localAssets)[0];
55
+ const anyLocalAsset = Object.values(localAssets).find(
56
+ (asset) =>
57
+ !asset.startsWith('file:///android_res/') && !asset.startsWith('file:///android_asset/')
58
+ );
56
59
  if (anyLocalAsset) {
57
60
  // Try to get the `.expo-internal` directory from the first local asset
58
61
  return anyLocalAsset.slice(0, anyLocalAsset.lastIndexOf('/'));
package/template.tgz CHANGED
Binary file