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.
- package/android/build.gradle +2 -2
- package/android/src/main/java/expo/modules/ReactActivityDelegateWrapper.kt +25 -0
- package/build/winter/fetch/FetchResponse.d.ts +2 -2
- package/build/winter/fetch/FetchResponse.d.ts.map +1 -1
- package/build/winter/fetch/NativeRequest.d.ts +1 -1
- package/build/winter/fetch/NativeRequest.d.ts.map +1 -1
- package/bundledNativeModules.json +83 -84
- package/internal/install-global.d.ts +2 -0
- package/internal/install-global.js +5 -0
- package/ios/AppDelegates/ExpoReactNativeFactory.swift +13 -0
- package/package.json +22 -22
- package/src/winter/__tests__/structuredClone.test.ios.ts +27 -0
- package/src/winter/fetch/FetchResponse.ts +4 -4
- package/src/winter/fetch/NativeRequest.ts +1 -1
- package/src/winter/fetch/__tests__/RequestUtils-test.ts +7 -7
- package/src/winter/runtime.native.ts +3 -0
- package/template.tgz +0 -0
package/android/build.gradle
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
|
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,
|
|
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;
|
|
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.
|
|
3
|
-
"@expo/metro-runtime": "~6.
|
|
4
|
-
"@expo/vector-icons": "^
|
|
5
|
-
"@expo/ui": "~0.2.0-alpha.
|
|
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.
|
|
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.
|
|
20
|
-
"expo-application": "~7.0.
|
|
21
|
-
"expo-asset": "~12.0.
|
|
22
|
-
"expo-audio": "~1.0.
|
|
23
|
-
"expo-auth-session": "~7.0.
|
|
24
|
-
"expo-av": "~16.0.
|
|
25
|
-
"expo-background-fetch": "~14.0.
|
|
26
|
-
"expo-background-task": "~1.0.
|
|
27
|
-
"expo-battery": "~10.0.
|
|
28
|
-
"expo-blur": "~15.0.
|
|
29
|
-
"expo-brightness": "~14.0.
|
|
30
|
-
"expo-build-properties": "~1.0.
|
|
31
|
-
"expo-calendar": "~15.0.
|
|
32
|
-
"expo-camera": "~17.0.
|
|
33
|
-
"expo-cellular": "~8.0.
|
|
34
|
-
"expo-checkbox": "~5.0.
|
|
35
|
-
"expo-clipboard": "~8.0.
|
|
36
|
-
"expo-constants": "~18.0.
|
|
37
|
-
"expo-contacts": "~15.0.
|
|
38
|
-
"expo-crypto": "~15.0.
|
|
39
|
-
"expo-dev-client": "~6.0.
|
|
40
|
-
"expo-device": "~8.0.
|
|
41
|
-
"expo-document-picker": "~14.0.
|
|
42
|
-
"expo-file-system": "~19.0.
|
|
43
|
-
"expo-font": "~14.0.
|
|
44
|
-
"expo-gl": "~16.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.
|
|
47
|
-
"expo-image": "~3.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.
|
|
50
|
-
"expo-image-picker": "~17.0.
|
|
51
|
-
"expo-intent-launcher": "~13.0.
|
|
52
|
-
"expo-insights": "~0.10.
|
|
53
|
-
"expo-keep-awake": "~15.0.
|
|
54
|
-
"expo-linear-gradient": "~15.0.
|
|
55
|
-
"expo-linking": "~8.0.
|
|
56
|
-
"expo-local-authentication": "~17.0.
|
|
57
|
-
"expo-localization": "~17.0.
|
|
58
|
-
"expo-location": "~19.0.
|
|
59
|
-
"expo-mail-composer": "~15.0.
|
|
60
|
-
"expo-manifests": "~1.0.
|
|
61
|
-
"expo-maps": "~0.12.
|
|
62
|
-
"expo-media-library": "~18.0.
|
|
63
|
-
"expo-mesh-gradient": "~0.4.
|
|
64
|
-
"expo-module-template": "~11.0.
|
|
65
|
-
"expo-modules-core": "~3.0.
|
|
66
|
-
"expo-navigation-bar": "~5.0.
|
|
67
|
-
"expo-network": "~8.0.
|
|
68
|
-
"expo-notifications": "~0.32.
|
|
69
|
-
"expo-print": "~15.0.
|
|
70
|
-
"expo-live-photo": "~1.0.
|
|
71
|
-
"expo-router": "~6.0.0-beta.
|
|
72
|
-
"expo-screen-capture": "~8.0.
|
|
73
|
-
"expo-screen-orientation": "~9.0.
|
|
74
|
-
"expo-secure-store": "~15.0.
|
|
75
|
-
"expo-sensors": "~15.0.
|
|
76
|
-
"expo-sharing": "~14.0.
|
|
77
|
-
"expo-sms": "~14.0.
|
|
78
|
-
"expo-speech": "~14.0.
|
|
79
|
-
"expo-splash-screen": "~31.0.
|
|
80
|
-
"expo-sqlite": "~16.0.
|
|
81
|
-
"expo-status-bar": "~3.0.
|
|
82
|
-
"expo-store-review": "~9.0.
|
|
83
|
-
"expo-symbols": "~1.0.
|
|
84
|
-
"expo-system-ui": "~6.0.
|
|
85
|
-
"expo-task-manager": "~14.0.
|
|
86
|
-
"expo-tracking-transparency": "~6.0.
|
|
87
|
-
"expo-updates": "~29.0.
|
|
88
|
-
"expo-video-thumbnails": "~10.0.
|
|
89
|
-
"expo-video": "~3.0.
|
|
90
|
-
"expo-web-browser": "~15.0.
|
|
91
|
-
"jest-expo": "~54.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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
116
|
-
"react-native-bootsplash": "^6.3.
|
|
114
|
+
"@sentry/react-native": "~6.20.0",
|
|
115
|
+
"react-native-bootsplash": "^6.3.10"
|
|
117
116
|
}
|
|
@@ -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.
|
|
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.
|
|
79
|
-
"@expo/config": "~12.0.
|
|
80
|
-
"@expo/config-plugins": "~11.0.
|
|
81
|
-
"@expo/devtools": "0.1.
|
|
82
|
-
"@expo/fingerprint": "0.14.
|
|
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.
|
|
85
|
-
"@expo/vector-icons": "^
|
|
86
|
-
"
|
|
87
|
-
"expo
|
|
88
|
-
"expo-
|
|
89
|
-
"expo-
|
|
90
|
-
"expo-
|
|
91
|
-
"expo-
|
|
92
|
-
"expo-
|
|
93
|
-
"expo-modules-
|
|
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.
|
|
102
|
-
"@types/react-test-renderer": "
|
|
103
|
-
"expo-module-scripts": "^5.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.
|
|
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": "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|