expo 54.0.0-preview.0 → 54.0.0-preview.10

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.0'
35
+ version = '54.0.0-preview.10'
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.0"
46
+ versionName "54.0.0-preview.10"
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
@@ -11,7 +11,7 @@ export declare class FetchResponse extends ConcreteNativeResponse implements Res
11
11
  private streamingState;
12
12
  private bodyStream;
13
13
  constructor(abortCleanupFunction: AbortSubscriptionCleanupFunction);
14
- get body(): ReadableStream<Uint8Array> | null;
14
+ get body(): ReadableStream<Uint8Array<ArrayBuffer>> | null;
15
15
  get headers(): Headers;
16
16
  get ok(): boolean;
17
17
  readonly type = "default";
@@ -21,7 +21,7 @@ export declare class FetchResponse extends ConcreteNativeResponse implements Res
21
21
  blob(): Promise<Blob>;
22
22
  formData(): Promise<UniversalFormData>;
23
23
  json(): Promise<any>;
24
- bytes(): Promise<Uint8Array>;
24
+ bytes(): Promise<Uint8Array<ArrayBuffer>>;
25
25
  toString(): string;
26
26
  toJSON(): object;
27
27
  clone(): Response;
@@ -1 +1 @@
1
- {"version":3,"file":"FetchResponse.d.ts","sourceRoot":"","sources":["../../../src/winter/fetch/FetchResponse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,QAAA,MAAM,sBAAsB,EAAqC,OAAO,cAAc,CAAC;AACvF,MAAM,MAAM,gCAAgC,GAAG,MAAM,IAAI,CAAC;AAI1D,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvE,KAAK,iBAAiB,GAAG,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC;AAE1D;;GAEG;AACH,qBAAa,aAAc,SAAQ,sBAAuB,YAAW,QAAQ;IAI/D,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAHjD,OAAO,CAAC,cAAc,CAA4C;IAClE,OAAO,CAAC,UAAU,CAA2C;gBAEhC,oBAAoB,EAAE,gCAAgC;IAKnF,IAAI,IAAI,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,CAuD5C;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,EAAE,IAAI,OAAO,CAEhB;IAED,SAAgB,IAAI,aAAa;IAEjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAYtC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAKpB,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;IAIlC,QAAQ,IAAI,MAAM;IAIlB,MAAM,IAAI,MAAM;IAShB,KAAK,IAAI,QAAQ;IAIjB,OAAO,CAAC,QAAQ,CAQd;CACH"}
1
+ {"version":3,"file":"FetchResponse.d.ts","sourceRoot":"","sources":["../../../src/winter/fetch/FetchResponse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,QAAA,MAAM,sBAAsB,EAAqC,OAAO,cAAc,CAAC;AACvF,MAAM,MAAM,gCAAgC,GAAG,MAAM,IAAI,CAAC;AAI1D,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvE,KAAK,iBAAiB,GAAG,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC;AAE1D;;GAEG;AACH,qBAAa,aAAc,SAAQ,sBAAuB,YAAW,QAAQ;IAI/D,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAHjD,OAAO,CAAC,cAAc,CAA4C;IAClE,OAAO,CAAC,UAAU,CAAwD;gBAE7C,oBAAoB,EAAE,gCAAgC;IAKnF,IAAI,IAAI,IAAI,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAuDzD;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,EAAE,IAAI,OAAO,CAEhB;IAED,SAAgB,IAAI,aAAa;IAEjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAYtC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAKpB,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAI/C,QAAQ,IAAI,MAAM;IAIlB,MAAM,IAAI,MAAM;IAShB,KAAK,IAAI,QAAQ;IAIjB,OAAO,CAAC,QAAQ,CAQd;CACH"}
@@ -23,7 +23,7 @@ export declare class NativeResponse extends SharedObject<NativeResponseEvents> {
23
23
  readonly statusText: string;
24
24
  readonly url: string;
25
25
  readonly redirected: boolean;
26
- startStreaming(): Promise<Uint8Array | null>;
26
+ startStreaming(): Promise<Uint8Array<ArrayBuffer> | null>;
27
27
  cancelStreaming(reason: string): void;
28
28
  arrayBuffer(): Promise<ArrayBuffer>;
29
29
  text(): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeRequest.d.ts","sourceRoot":"","sources":["../../../src/winter/fetch/NativeRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,YAAY;IAC9C,KAAK,CACV,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,UAAU,GAAG,IAAI,GAC7B,OAAO,CAAC,cAAc,CAAC;IACnB,MAAM,IAAI,IAAI;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/C,WAAW,IAAI,IAAI,CAAC;IACpB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,sBAAsB,IAAI,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IAC5E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAC5C,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IACrC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IACnC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"NativeRequest.d.ts","sourceRoot":"","sources":["../../../src/winter/fetch/NativeRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,YAAY;IAC9C,KAAK,CACV,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,UAAU,GAAG,IAAI,GAC7B,OAAO,CAAC,cAAc,CAAC;IACnB,MAAM,IAAI,IAAI;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/C,WAAW,IAAI,IAAI,CAAC;IACpB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,sBAAsB,IAAI,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IAC5E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IACzD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IACrC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IACnC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CACxB"}
@@ -1,13 +1,13 @@
1
1
  {
2
- "@expo/fingerprint": "~0.14.0",
3
- "@expo/metro-runtime": "~6.0.0",
4
- "@expo/vector-icons": "^14.1.0",
5
- "@expo/ui": "~0.2.0-alpha.0",
2
+ "@expo/fingerprint": "~0.14.4",
3
+ "@expo/metro-runtime": "~6.1.1",
4
+ "@expo/vector-icons": "^15.0.0",
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.0",
20
- "expo-application": "~7.0.0",
21
- "expo-asset": "~12.0.0",
22
- "expo-audio": "~1.0.0",
23
- "expo-auth-session": "~7.0.0",
24
- "expo-av": "~16.0.0",
25
- "expo-background-fetch": "~14.0.0",
26
- "expo-background-task": "~1.0.0",
27
- "expo-battery": "~10.0.0",
28
- "expo-blur": "~15.0.0",
29
- "expo-brightness": "~14.0.0",
30
- "expo-build-properties": "~1.0.0",
31
- "expo-calendar": "~15.0.0",
32
- "expo-camera": "~17.0.0",
33
- "expo-cellular": "~8.0.0",
34
- "expo-checkbox": "~5.0.0",
35
- "expo-clipboard": "~8.0.0",
36
- "expo-constants": "~18.0.0",
37
- "expo-contacts": "~15.0.0",
38
- "expo-crypto": "~15.0.0",
39
- "expo-dev-client": "~6.0.0",
40
- "expo-device": "~8.0.0",
41
- "expo-document-picker": "~14.0.0",
42
- "expo-file-system": "~19.0.0",
43
- "expo-font": "~14.0.0",
44
- "expo-gl": "~16.0.0",
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.4",
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.4",
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.0",
47
- "expo-image": "~3.0.0",
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.0",
50
- "expo-image-picker": "~17.0.0",
51
- "expo-intent-launcher": "~13.0.0",
52
- "expo-insights": "~0.10.0",
53
- "expo-keep-awake": "~15.0.0",
54
- "expo-linear-gradient": "~15.0.0",
55
- "expo-linking": "~8.0.0",
56
- "expo-local-authentication": "~17.0.0",
57
- "expo-localization": "~17.0.0",
58
- "expo-location": "~19.0.0",
59
- "expo-mail-composer": "~15.0.0",
60
- "expo-manifests": "~1.0.0",
61
- "expo-maps": "~0.12.0",
62
- "expo-media-library": "~18.0.0",
63
- "expo-mesh-gradient": "~0.4.0",
64
- "expo-module-template": "~11.0.0",
65
- "expo-modules-core": "~3.0.0",
66
- "expo-navigation-bar": "~5.0.0",
67
- "expo-network": "~8.0.0",
68
- "expo-notifications": "~0.32.0",
69
- "expo-print": "~15.0.0",
70
- "expo-live-photo": "~1.0.0",
71
- "expo-router": "~6.0.0-beta.0",
72
- "expo-screen-capture": "~8.0.0",
73
- "expo-screen-orientation": "~9.0.0",
74
- "expo-secure-store": "~15.0.0",
75
- "expo-sensors": "~15.0.0",
76
- "expo-sharing": "~14.0.0",
77
- "expo-sms": "~14.0.0",
78
- "expo-speech": "~14.0.0",
79
- "expo-splash-screen": "~31.0.0",
80
- "expo-sqlite": "~16.0.0",
81
- "expo-status-bar": "~3.0.0",
82
- "expo-store-review": "~9.0.0",
83
- "expo-symbols": "~1.0.0",
84
- "expo-system-ui": "~6.0.0",
85
- "expo-task-manager": "~14.0.0",
86
- "expo-tracking-transparency": "~6.0.0",
87
- "expo-updates": "~29.0.0",
88
- "expo-video-thumbnails": "~10.0.0",
89
- "expo-video": "~3.0.0",
90
- "expo-web-browser": "~15.0.0",
91
- "jest-expo": "~54.0.0",
49
+ "expo-image-manipulator": "~14.0.4",
50
+ "expo-image-picker": "~17.0.4",
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.4",
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.8",
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.9",
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.5",
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.5",
88
+ "expo-video-thumbnails": "~10.0.4",
89
+ "expo-video": "~3.0.6",
90
+ "expo-web-browser": "~15.0.4",
91
+ "jest-expo": "~54.0.4",
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
102
  "react-native-worklets": "~0.4.1",
104
103
  "react-native-reanimated": "~4.0.2",
105
- "react-native-screens": "4.14.0-nightly-20250803-1df3db25a",
106
- "react-native-safe-area-context": "5.6.0",
104
+ "react-native-screens": "~4.15.3",
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.0",
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
+ };
@@ -5,6 +5,19 @@ import React
5
5
  @MainActor public class ExpoReactNativeFactory: RCTReactNativeFactory {
6
6
  private let reactDelegate = ExpoReactDelegate(handlers: ExpoAppDelegateSubscriberRepository.reactDelegateHandlers)
7
7
 
8
+ @objc public override init(delegate: any RCTReactNativeFactoryDelegate) {
9
+ let releaseLevel = (Bundle.main.object(forInfoDictionaryKey: "ReactNativeReleaseLevel") as? String)
10
+ .flatMap { [
11
+ "canary": RCTReleaseLevel.Canary,
12
+ "experimental": RCTReleaseLevel.Experimental,
13
+ "stable": RCTReleaseLevel.Stable
14
+ ][$0.lowercased()]
15
+ }
16
+ ?? RCTReleaseLevel.Stable
17
+
18
+ super.init(delegate: delegate, releaseLevel: releaseLevel)
19
+ }
20
+
8
21
  @objc func createRCTRootViewFactory() -> RCTRootViewFactory {
9
22
  // Alan: This is temporary. We need to cast to ExpoReactNativeFactoryDelegate here because currently, if you extend RCTReactNativeFactory
10
23
  // from Swift, customizeRootView will not work on the new arch because the cast to RCTRootView will never
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo",
3
- "version": "54.0.0-preview.0",
3
+ "version": "54.0.0-preview.10",
4
4
  "description": "The Expo SDK",
5
5
  "main": "src/Expo.ts",
6
6
  "module": "src/Expo.ts",
@@ -75,35 +75,35 @@
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.0",
79
- "@expo/config": "~12.0.0",
80
- "@expo/config-plugins": "~11.0.0",
81
- "@expo/devtools": "0.1.0",
82
- "@expo/fingerprint": "0.14.0",
78
+ "@expo/cli": "0.26.4",
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.0",
85
- "@expo/vector-icons": "^14.0.0",
86
- "babel-preset-expo": "~14.0.0",
87
- "expo-asset": "~12.0.0",
88
- "expo-constants": "~18.0.0",
89
- "expo-file-system": "~19.0.0",
90
- "expo-font": "~14.0.0",
91
- "expo-keep-awake": "~15.0.0",
92
- "expo-modules-autolinking": "3.0.0",
93
- "expo-modules-core": "3.0.0",
84
+ "@expo/metro-config": "0.21.6",
85
+ "@expo/vector-icons": "^15.0.0",
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.8",
94
95
  "pretty-format": "^29.7.0",
95
- "react-native-edge-to-edge": "1.6.0",
96
96
  "react-refresh": "^0.14.2",
97
97
  "whatwg-url-without-unicode": "8.0.0-3"
98
98
  },
99
99
  "devDependencies": {
100
100
  "@types/node": "^22.14.0",
101
- "@types/react": "~19.0.10",
102
- "@types/react-test-renderer": "^19.1.0",
103
- "expo-module-scripts": "^5.0.0",
101
+ "@types/react": "~19.1.10",
102
+ "@types/react-test-renderer": "~19.1.0",
103
+ "expo-module-scripts": "^5.0.4",
104
104
  "react": "19.1.0",
105
105
  "react-dom": "19.1.0",
106
- "react-native": "0.81.0",
106
+ "react-native": "0.81.1",
107
107
  "web-streams-polyfill": "^3.3.2"
108
108
  },
109
109
  "peerDependencies": {
@@ -124,5 +124,5 @@
124
124
  "optional": true
125
125
  }
126
126
  },
127
- "gitHead": "cb7062e2c17d1fb09522834aaaac0e19b766df62"
127
+ "gitHead": "48faa7b9a9f93a7660cb80aa118c7f6bf0aeff38"
128
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
+ });
@@ -14,14 +14,14 @@ type UniversalFormData = globalThis.FormData & RNFormData;
14
14
  */
15
15
  export class FetchResponse extends ConcreteNativeResponse implements Response {
16
16
  private streamingState: 'none' | 'started' | 'completed' = 'none';
17
- private bodyStream: ReadableStream<Uint8Array> | null = null;
17
+ private bodyStream: ReadableStream<Uint8Array<ArrayBuffer>> | null = null;
18
18
 
19
19
  constructor(private readonly abortCleanupFunction: AbortSubscriptionCleanupFunction) {
20
20
  super();
21
21
  this.addListener('readyForJSFinalization', this.finalize);
22
22
  }
23
23
 
24
- get body(): ReadableStream<Uint8Array> | null {
24
+ get body(): ReadableStream<Uint8Array<ArrayBuffer>> | null {
25
25
  if (this.bodyStream == null) {
26
26
  const response = this;
27
27
 
@@ -35,7 +35,7 @@ export class FetchResponse extends ConcreteNativeResponse implements Response {
35
35
  if (response.streamingState === 'completed') {
36
36
  return;
37
37
  }
38
- response.addListener('didReceiveResponseData', (data: Uint8Array) => {
38
+ response.addListener('didReceiveResponseData', (data: Uint8Array<ArrayBuffer>) => {
39
39
  if (!isControllerClosed) {
40
40
  controller.enqueue(data);
41
41
  }
@@ -113,7 +113,7 @@ export class FetchResponse extends ConcreteNativeResponse implements Response {
113
113
  return JSON.parse(text);
114
114
  }
115
115
 
116
- async bytes(): Promise<Uint8Array> {
116
+ async bytes(): Promise<Uint8Array<ArrayBuffer>> {
117
117
  return new Uint8Array(await this.arrayBuffer());
118
118
  }
119
119
 
@@ -32,7 +32,7 @@ export declare class NativeResponse extends SharedObject<NativeResponseEvents> {
32
32
  readonly statusText: string;
33
33
  readonly url: string;
34
34
  readonly redirected: boolean;
35
- startStreaming(): Promise<Uint8Array | null>;
35
+ startStreaming(): Promise<Uint8Array<ArrayBuffer> | null>;
36
36
  cancelStreaming(reason: string): void;
37
37
  arrayBuffer(): Promise<ArrayBuffer>;
38
38
  text(): Promise<string>;
@@ -5,7 +5,7 @@
5
5
 
6
6
  import { TextDecoder, TextEncoder } from 'node:util';
7
7
  import RNFormData from 'react-native/Libraries/Network/FormData';
8
- import { ReadableStream } from 'web-streams-polyfill';
8
+ import { ReadableStream as WebReadableStream } from 'web-streams-polyfill';
9
9
 
10
10
  import { type NativeHeadersType } from '../NativeRequest';
11
11
  import {
@@ -25,12 +25,12 @@ globalThis.TextEncoder ??= TextEncoder;
25
25
 
26
26
  describe(convertReadableStreamToUint8ArrayAsync, () => {
27
27
  it('should convert a readable stream to a Uint8Array', async () => {
28
- const stream = new ReadableStream<Uint8Array>({
28
+ const stream = new WebReadableStream<Uint8Array>({
29
29
  start(controller) {
30
30
  controller.enqueue(new TextEncoder().encode('Hello, world!'));
31
31
  controller.close();
32
32
  },
33
- });
33
+ }) as ReadableStream<Uint8Array>;
34
34
 
35
35
  const result = await convertReadableStreamToUint8ArrayAsync(stream);
36
36
  const resultString = new TextDecoder().decode(result);
@@ -38,22 +38,22 @@ describe(convertReadableStreamToUint8ArrayAsync, () => {
38
38
  });
39
39
 
40
40
  it('should handle an empty readable stream', async () => {
41
- const stream = new ReadableStream({
41
+ const stream = new WebReadableStream({
42
42
  start(controller) {
43
43
  controller.close();
44
44
  },
45
- });
45
+ }) as ReadableStream;
46
46
 
47
47
  const result = await convertReadableStreamToUint8ArrayAsync(stream);
48
48
  expect(result).toEqual(new Uint8Array());
49
49
  });
50
50
 
51
51
  it('should handle errors in the readable stream', async () => {
52
- const stream = new ReadableStream({
52
+ const stream = new WebReadableStream({
53
53
  start(controller) {
54
54
  controller.error(new Error('Stream error'));
55
55
  },
56
- });
56
+ }) as ReadableStream;
57
57
 
58
58
  await expect(convertReadableStreamToUint8ArrayAsync(stream)).rejects.toThrow('Stream error');
59
59
  });
@@ -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