expo 54.0.0-preview.1 → 54.0.0-preview.11

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 = '54.0.0-preview.1'
35
+ version = '54.0.0-preview.11'
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 "54.0.0-preview.1"
46
+ versionName "54.0.0-preview.11"
47
47
  consumerProguardFiles("proguard-rules.pro")
48
48
  }
49
49
  testOptions {
@@ -12,6 +12,7 @@ import android.os.Bundle
12
12
  import android.util.Log
13
13
  import android.view.KeyEvent
14
14
  import android.view.ViewGroup
15
+ import android.view.Window
15
16
  import androidx.annotation.VisibleForTesting
16
17
  import androidx.collection.ArrayMap
17
18
  import androidx.lifecycle.lifecycleScope
@@ -155,6 +156,11 @@ class ReactActivityDelegateWrapper(
155
156
  activity.window.colorMode = ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT
156
157
  }
157
158
 
159
+ val edgeToEdgeEnabled = invokeWindowUtilKtMethod<Boolean>("isEdgeToEdgeFeatureFlagOn") ?: true
160
+ if (edgeToEdgeEnabled) {
161
+ invokeWindowUtilKtMethod<Unit>("enableEdgeToEdge", Pair(Window::class.java, plainActivity.window))
162
+ }
163
+
158
164
  val launchOptions = composeLaunchOptions()
159
165
  val reactDelegate: ReactDelegate
160
166
  if (ReactNativeFeatureFlags.enableBridgelessArchitecture) {
@@ -426,6 +432,25 @@ class ReactActivityDelegateWrapper(
426
432
  return method!!.invoke(delegate, *args) as T
427
433
  }
428
434
 
435
+ private inline fun <reified T> invokeWindowUtilKtMethod(
436
+ methodName: String,
437
+ vararg args: Pair<Class<*>, Any?>
438
+ ): T? {
439
+ val windowUtilClassName = "com.facebook.react.views.view.WindowUtilKt"
440
+
441
+ return runCatching {
442
+ val windowUtilKtClass = Class.forName(windowUtilClassName)
443
+ val parameterTypes = args.map { it.first }.toTypedArray()
444
+ val parameterValues = args.map { it.second }.toTypedArray()
445
+ val method = windowUtilKtClass.getDeclaredMethod(methodName, *parameterTypes)
446
+
447
+ method.isAccessible = true
448
+ method.invoke(null, *parameterValues) as? T
449
+ }.onFailure {
450
+ Log.e(TAG, "Failed to invoke '$methodName' on $windowUtilClassName", it)
451
+ }.getOrNull()
452
+ }
453
+
429
454
  private suspend fun loadAppImpl(appKey: String?, supportsDelayLoad: Boolean) {
430
455
  // Give modules a chance to wrap the ReactRootView in a container ViewGroup. If some module
431
456
  // wants to do this, we override the functionality of `loadApp` and call `setContentView` with
@@ -1,13 +1,13 @@
1
1
  {
2
- "@expo/fingerprint": "~0.14.1",
3
- "@expo/metro-runtime": "~6.0.1",
4
- "@expo/vector-icons": "^14.1.0",
5
- "@expo/ui": "~0.2.0-alpha.1",
2
+ "@expo/fingerprint": "~0.14.4",
3
+ "@expo/metro-runtime": "~6.1.1",
4
+ "@expo/vector-icons": "^15.0.2",
5
+ "@expo/ui": "~0.2.0-alpha.6",
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
- "@react-native-community/slider": "5.0.0",
10
+ "@react-native-community/slider": "5.0.1",
11
11
  "@react-native-community/viewpager": "5.0.11",
12
12
  "@react-native-picker/picker": "2.11.1",
13
13
  "@react-native-segmented-control/segmented-control": "2.5.7",
@@ -16,102 +16,101 @@
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.1",
20
- "expo-application": "~7.0.1",
21
- "expo-asset": "~12.0.1",
22
- "expo-audio": "~1.0.1",
23
- "expo-auth-session": "~7.0.1",
24
- "expo-av": "~16.0.1",
25
- "expo-background-fetch": "~14.0.1",
26
- "expo-background-task": "~1.0.1",
27
- "expo-battery": "~10.0.1",
28
- "expo-blur": "~15.0.1",
29
- "expo-brightness": "~14.0.1",
30
- "expo-build-properties": "~1.0.1",
31
- "expo-calendar": "~15.0.1",
32
- "expo-camera": "~17.0.1",
33
- "expo-cellular": "~8.0.1",
34
- "expo-checkbox": "~5.0.1",
35
- "expo-clipboard": "~8.0.1",
36
- "expo-constants": "~18.0.1",
37
- "expo-contacts": "~15.0.1",
38
- "expo-crypto": "~15.0.1",
39
- "expo-dev-client": "~6.0.1",
40
- "expo-device": "~8.0.1",
41
- "expo-document-picker": "~14.0.1",
42
- "expo-file-system": "~19.0.1",
43
- "expo-font": "~14.0.1",
44
- "expo-gl": "~16.0.1",
19
+ "expo-apple-authentication": "~8.0.4",
20
+ "expo-application": "~7.0.4",
21
+ "expo-asset": "~12.0.5",
22
+ "expo-audio": "~1.0.6",
23
+ "expo-auth-session": "~7.0.5",
24
+ "expo-av": "~16.0.4",
25
+ "expo-background-fetch": "~14.0.4",
26
+ "expo-background-task": "~1.0.4",
27
+ "expo-battery": "~10.0.4",
28
+ "expo-blur": "~15.0.4",
29
+ "expo-brightness": "~14.0.4",
30
+ "expo-build-properties": "~1.0.5",
31
+ "expo-calendar": "~15.0.5",
32
+ "expo-camera": "~17.0.4",
33
+ "expo-cellular": "~8.0.4",
34
+ "expo-checkbox": "~5.0.4",
35
+ "expo-clipboard": "~8.0.4",
36
+ "expo-constants": "~18.0.5",
37
+ "expo-contacts": "~15.0.5",
38
+ "expo-crypto": "~15.0.4",
39
+ "expo-dev-client": "~6.0.6",
40
+ "expo-device": "~8.0.4",
41
+ "expo-document-picker": "~14.0.4",
42
+ "expo-file-system": "~19.0.6",
43
+ "expo-font": "~14.0.5",
44
+ "expo-gl": "~16.0.4",
45
45
  "expo-google-app-auth": "~8.3.0",
46
- "expo-haptics": "~15.0.1",
47
- "expo-image": "~3.0.1",
46
+ "expo-haptics": "~15.0.4",
47
+ "expo-image": "~3.0.4",
48
48
  "expo-image-loader": "~6.0.0",
49
- "expo-image-manipulator": "~14.0.1",
50
- "expo-image-picker": "~17.0.1",
51
- "expo-intent-launcher": "~13.0.1",
52
- "expo-insights": "~0.10.1",
53
- "expo-keep-awake": "~15.0.1",
54
- "expo-linear-gradient": "~15.0.1",
55
- "expo-linking": "~8.0.1",
56
- "expo-local-authentication": "~17.0.1",
57
- "expo-localization": "~17.0.1",
58
- "expo-location": "~19.0.1",
59
- "expo-mail-composer": "~15.0.1",
60
- "expo-manifests": "~1.0.1",
61
- "expo-maps": "~0.12.1",
62
- "expo-media-library": "~18.0.1",
63
- "expo-mesh-gradient": "~0.4.1",
64
- "expo-module-template": "~11.0.1",
65
- "expo-modules-core": "~3.0.1",
66
- "expo-navigation-bar": "~5.0.1",
67
- "expo-network": "~8.0.1",
68
- "expo-notifications": "~0.32.1",
69
- "expo-print": "~15.0.1",
70
- "expo-live-photo": "~1.0.1",
71
- "expo-router": "~6.0.0-beta.1",
72
- "expo-screen-capture": "~8.0.1",
73
- "expo-screen-orientation": "~9.0.1",
74
- "expo-secure-store": "~15.0.1",
75
- "expo-sensors": "~15.0.1",
76
- "expo-sharing": "~14.0.1",
77
- "expo-sms": "~14.0.1",
78
- "expo-speech": "~14.0.1",
79
- "expo-splash-screen": "~31.0.1",
80
- "expo-sqlite": "~16.0.1",
81
- "expo-status-bar": "~3.0.1",
82
- "expo-store-review": "~9.0.1",
83
- "expo-symbols": "~1.0.1",
84
- "expo-system-ui": "~6.0.1",
85
- "expo-task-manager": "~14.0.1",
86
- "expo-tracking-transparency": "~6.0.1",
87
- "expo-updates": "~29.0.1",
88
- "expo-video-thumbnails": "~10.0.1",
89
- "expo-video": "~3.0.1",
90
- "expo-web-browser": "~15.0.1",
91
- "jest-expo": "~54.0.0",
49
+ "expo-image-manipulator": "~14.0.4",
50
+ "expo-image-picker": "~17.0.5",
51
+ "expo-intent-launcher": "~13.0.4",
52
+ "expo-insights": "~0.10.4",
53
+ "expo-keep-awake": "~15.0.4",
54
+ "expo-linear-gradient": "~15.0.4",
55
+ "expo-linking": "~8.0.5",
56
+ "expo-local-authentication": "~17.0.4",
57
+ "expo-localization": "~17.0.4",
58
+ "expo-location": "~19.0.4",
59
+ "expo-mail-composer": "~15.0.4",
60
+ "expo-manifests": "~1.0.5",
61
+ "expo-maps": "~0.12.4",
62
+ "expo-media-library": "~18.0.4",
63
+ "expo-mesh-gradient": "~0.4.4",
64
+ "expo-module-template": "~11.0.6",
65
+ "expo-modules-core": "~3.0.9",
66
+ "expo-navigation-bar": "~5.0.5",
67
+ "expo-network": "~8.0.4",
68
+ "expo-notifications": "~0.32.6",
69
+ "expo-print": "~15.0.4",
70
+ "expo-live-photo": "~1.0.4",
71
+ "expo-router": "~6.0.0-beta.10",
72
+ "expo-screen-capture": "~8.0.4",
73
+ "expo-screen-orientation": "~9.0.4",
74
+ "expo-secure-store": "~15.0.4",
75
+ "expo-sensors": "~15.0.4",
76
+ "expo-sharing": "~14.0.4",
77
+ "expo-sms": "~14.0.4",
78
+ "expo-speech": "~14.0.4",
79
+ "expo-splash-screen": "~31.0.6",
80
+ "expo-sqlite": "~16.0.5",
81
+ "expo-status-bar": "~3.0.5",
82
+ "expo-store-review": "~9.0.4",
83
+ "expo-symbols": "~1.0.4",
84
+ "expo-system-ui": "~6.0.4",
85
+ "expo-task-manager": "~14.0.4",
86
+ "expo-tracking-transparency": "~6.0.4",
87
+ "expo-updates": "~29.0.6",
88
+ "expo-video-thumbnails": "~10.0.4",
89
+ "expo-video": "~3.0.7",
90
+ "expo-web-browser": "~15.0.4",
91
+ "jest-expo": "~54.0.5",
92
92
  "lottie-react-native": "~7.3.1",
93
93
  "react": "19.1.0",
94
94
  "react-dom": "19.1.0",
95
- "react-native": "0.81.0",
95
+ "react-native": "0.81.1",
96
96
  "react-native-web": "~0.21.0",
97
- "react-native-edge-to-edge": "1.6.0",
98
97
  "react-native-gesture-handler": "~2.28.0",
99
98
  "react-native-get-random-values": "~1.11.0",
100
- "react-native-keyboard-controller": "1.18.4",
99
+ "react-native-keyboard-controller": "1.18.5",
101
100
  "react-native-maps": "1.20.1",
102
101
  "react-native-pager-view": "6.9.1",
103
- "react-native-worklets": "~0.4.1",
102
+ "react-native-worklets": "~0.4.2",
104
103
  "react-native-reanimated": "~4.0.2",
105
- "react-native-screens": "4.14.0",
106
- "react-native-safe-area-context": "5.6.0",
104
+ "react-native-screens": "~4.15.4",
105
+ "react-native-safe-area-context": "~5.6.0",
107
106
  "react-native-svg": "15.12.1",
108
107
  "react-native-view-shot": "4.0.3",
109
108
  "react-native-webview": "13.15.0",
110
109
  "sentry-expo": "~7.0.0",
111
- "unimodules-app-loader": "~6.0.1",
110
+ "unimodules-app-loader": "~6.0.4",
112
111
  "unimodules-image-loader-interface": "~6.1.0",
113
112
  "@shopify/react-native-skia": "2.2.3",
114
113
  "@shopify/flash-list": "2.0.2",
115
- "@sentry/react-native": "~6.14.0",
116
- "react-native-bootsplash": "^6.3.7"
114
+ "@sentry/react-native": "~6.20.0",
115
+ "react-native-bootsplash": "^6.3.10"
117
116
  }
@@ -0,0 +1,2 @@
1
+ // WARN: Internal re-export, don't rely on this to be a public API or use it outside of `expo/expo`'s monorepo
2
+ export { installGlobal } from '../src/winter/installGlobal';
@@ -0,0 +1,5 @@
1
+ // WARN: Internal re-export, don't rely on this to be a public API or use it outside of `expo/expo`'s monorepo
2
+ const { installGlobal } = require('../src/winter/installGlobal');
3
+ module.exports = {
4
+ installGlobal,
5
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo",
3
- "version": "54.0.0-preview.1",
3
+ "version": "54.0.0-preview.11",
4
4
  "description": "The Expo SDK",
5
5
  "main": "src/Expo.ts",
6
6
  "module": "src/Expo.ts",
@@ -75,23 +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": "0.25.1",
79
- "@expo/config": "~12.0.1",
80
- "@expo/config-plugins": "~11.0.1",
81
- "@expo/devtools": "0.1.1",
82
- "@expo/fingerprint": "0.14.1",
78
+ "@expo/cli": "0.26.5",
79
+ "@expo/config": "~12.0.5",
80
+ "@expo/config-plugins": "~11.0.5",
81
+ "@expo/devtools": "0.1.4",
82
+ "@expo/fingerprint": "0.14.4",
83
83
  "@expo/metro": "~0.1.1",
84
- "@expo/metro-config": "0.21.1",
85
- "@expo/vector-icons": "^14.0.0",
86
- "babel-preset-expo": "~14.0.1",
87
- "expo-asset": "~12.0.1",
88
- "expo-constants": "~18.0.1",
89
- "expo-font": "~14.0.1",
90
- "expo-keep-awake": "~15.0.1",
91
- "expo-modules-autolinking": "3.0.1",
92
- "expo-modules-core": "3.0.1",
84
+ "@expo/metro-config": "0.21.6",
85
+ "@expo/vector-icons": "^15.0.2",
86
+ "@ungap/structured-clone": "^1.3.0",
87
+ "babel-preset-expo": "~14.0.4",
88
+ "expo-asset": "~12.0.5",
89
+ "expo-constants": "~18.0.5",
90
+ "expo-file-system": "~19.0.6",
91
+ "expo-font": "~14.0.5",
92
+ "expo-keep-awake": "~15.0.4",
93
+ "expo-modules-autolinking": "3.0.4",
94
+ "expo-modules-core": "3.0.9",
93
95
  "pretty-format": "^29.7.0",
94
- "react-native-edge-to-edge": "1.6.0",
95
96
  "react-refresh": "^0.14.2",
96
97
  "whatwg-url-without-unicode": "8.0.0-3"
97
98
  },
@@ -99,10 +100,10 @@
99
100
  "@types/node": "^22.14.0",
100
101
  "@types/react": "~19.1.10",
101
102
  "@types/react-test-renderer": "~19.1.0",
102
- "expo-module-scripts": "^5.0.1",
103
+ "expo-module-scripts": "^5.0.5",
103
104
  "react": "19.1.0",
104
105
  "react-dom": "19.1.0",
105
- "react-native": "0.81.0",
106
+ "react-native": "0.81.1",
106
107
  "web-streams-polyfill": "^3.3.2"
107
108
  },
108
109
  "peerDependencies": {
@@ -123,5 +124,5 @@
123
124
  "optional": true
124
125
  }
125
126
  },
126
- "gitHead": "2f7f90d0736af48cb542ccbc8addb836e330693a"
127
+ "gitHead": "5e15f3a5d68bc213ad36d59113d725fdea4f3411"
127
128
  }
@@ -0,0 +1,27 @@
1
+ describe('structuredClone', () => {
2
+ it(`uses the Expo built-in APIs`, () => {
3
+ expect((structuredClone as any)[Symbol.for('expo.builtin')]).toBe(true);
4
+ });
5
+
6
+ it(`clones primitives`, () => {
7
+ const obj = {
8
+ a: 1,
9
+ b: 'string',
10
+ c: [1, 2, 3],
11
+ d: { nested: true },
12
+ e: new Date(),
13
+ f: /regex/,
14
+ g: new Map([['key', 'value']]),
15
+ h: new Set([1, 2, 3]),
16
+ };
17
+
18
+ const cloned = structuredClone(obj);
19
+
20
+ expect(cloned).toEqual(obj);
21
+ expect(cloned).not.toBe(obj); // Ensure it's a deep clone
22
+ expect(cloned.e).toBeInstanceOf(Date);
23
+ expect(cloned.f).toBeInstanceOf(RegExp);
24
+ expect(cloned.g).toBeInstanceOf(Map);
25
+ expect(cloned.h).toBeInstanceOf(Set);
26
+ });
27
+ });
@@ -19,6 +19,9 @@ install('URLSearchParams', () => require('./url').URLSearchParams);
19
19
 
20
20
  install('__ExpoImportMetaRegistry', () => require('./ImportMetaRegistry').ImportMetaRegistry);
21
21
 
22
+ // https://html.spec.whatwg.org/multipage/structured-data.html#structuredclone
23
+ install('structuredClone', () => require('@ungap/structured-clone').default);
24
+
22
25
  installFormDataPatch(FormData);
23
26
 
24
27
  // Polyfill async iterator symbol for Hermes.
package/template.tgz CHANGED
Binary file