expo 54.0.0-canary-20250722-599a28f → 54.0.0-canary-20250729-d8899ae
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/build/async-require/hmr.d.ts.map +1 -1
- package/build/winter/FormData.d.ts.map +1 -1
- package/build/winter/fetch/RequestUtils.d.ts.map +1 -1
- package/build/winter/fetch/convertFormData.d.ts.map +1 -1
- package/bundledNativeModules.json +83 -82
- package/ios/AppDelegates/ExpoAppDelegate.swift +1 -1
- package/ios/AppDelegates/ExpoReactNativeFactory.swift +1 -1
- package/ios/Fetch/ExpoFetchCustomExtension.swift +1 -1
- package/ios/Fetch/ExpoFetchModule.swift +3 -3
- package/ios/Fetch/ExpoURLSessionTask.swift +2 -2
- package/ios/Fetch/NativeRequest.swift +1 -1
- package/ios/Fetch/NativeResponse.swift +2 -2
- package/package.json +18 -17
- package/src/async-require/hmr.ts +1 -2
- package/src/winter/FormData.ts +1 -9
- package/src/winter/fetch/RequestUtils.ts +15 -1
- package/src/winter/fetch/__tests__/convertFormData-test.native.ts +1 -3
- package/src/winter/fetch/convertFormData.ts +56 -27
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-canary-
|
|
35
|
+
version = '54.0.0-canary-20250729-d8899ae'
|
|
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-canary-
|
|
46
|
+
versionName "54.0.0-canary-20250729-d8899ae"
|
|
47
47
|
consumerProguardFiles("proguard-rules.pro")
|
|
48
48
|
}
|
|
49
49
|
testOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../src/async-require/hmr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../src/async-require/hmr.ts"],"names":[],"mappings":"AA4CA,KAAK,QAAQ,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,KAAK,GACL,OAAO,GACP,gBAAgB,GAChB,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxC,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC5C,CAAC;AAMF;;;GAGG;AACH,QAAA,MAAM,SAAS,EAAE,wBAsMhB,CAAC;AAuEF,eAAe,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormData.d.ts","sourceRoot":"","sources":["../../src/winter/FormData.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAAC;AAC9C,MAAM,MAAM,gBAAgB,GACxB;IAEE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACrC,GACD;IAEE,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,GACD;IAEE,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEN,MAAM,CAAC,OAAO,OAAO,YAAY;;IAI/B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAChF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IACzC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAE1D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAC5C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAC1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAG1B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAC7E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IACtC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAGvD,OAAO,CACL,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAC9E,OAAO,CAAC,EAAE,OAAO,GAChB,IAAI;IACP,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAChC,MAAM,IAAI,gBAAgB,CAAC,kBAAkB,CAAC;IAC9C,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACzD,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CACpE;
|
|
1
|
+
{"version":3,"file":"FormData.d.ts","sourceRoot":"","sources":["../../src/winter/FormData.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAAC;AAC9C,MAAM,MAAM,gBAAgB,GACxB;IAEE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACrC,GACD;IAEE,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,GACD;IAEE,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEN,MAAM,CAAC,OAAO,OAAO,YAAY;;IAI/B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAChF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IACzC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAE1D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAC5C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAC1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAG1B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAC7E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IACtC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAGvD,OAAO,CACL,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAC9E,OAAO,CAAC,EAAE,OAAO,GAChB,IAAI;IACP,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAChC,MAAM,IAAI,gBAAgB,CAAC,kBAAkB,CAAC;IAC9C,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACzD,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CACpE;AA0BD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,QAAQ,GAAG,OAAO,YAAY,CAkInF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestUtils.d.ts","sourceRoot":"","sources":["../../../src/winter/fetch/RequestUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzD;;GAEG;AACH,wBAAsB,sCAAsC,CAC1D,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACjC,OAAO,CAAC,UAAU,CAAC,CAsBrB;
|
|
1
|
+
{"version":3,"file":"RequestUtils.d.ts","sourceRoot":"","sources":["../../../src/winter/fetch/RequestUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzD;;GAEG;AACH,wBAAsB,sCAAsC,CAC1D,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GACjC,OAAO,CAAC,UAAU,CAAC,CAsBrB;AAgBD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;CAAE,CAAC,CA6C7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,CAe/F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,iBAAiB,GAC5B,iBAAiB,CAYnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertFormData.d.ts","sourceRoot":"","sources":["../../../src/winter/fetch/convertFormData.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"convertFormData.d.ts","sourceRoot":"","sources":["../../../src/winter/fetch/convertFormData.ts"],"names":[],"mappings":"AA+BA;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,GAAE,MAAyB,GAClC,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAoDjD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAOvC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAWhE"}
|
|
@@ -1,94 +1,94 @@
|
|
|
1
1
|
{
|
|
2
|
-
"@expo/fingerprint": "0.13.5-canary-
|
|
3
|
-
"@expo/metro-runtime": "6.0.0-canary-
|
|
2
|
+
"@expo/fingerprint": "0.13.5-canary-20250729-d8899ae",
|
|
3
|
+
"@expo/metro-runtime": "6.0.0-canary-20250729-d8899ae",
|
|
4
4
|
"@expo/vector-icons": "^14.1.0",
|
|
5
|
-
"@expo/ui": "0.1.1-canary-
|
|
5
|
+
"@expo/ui": "0.1.1-canary-20250729-d8899ae",
|
|
6
6
|
"@react-native-async-storage/async-storage": "2.2.0",
|
|
7
|
-
"@react-native-community/datetimepicker": "8.4.
|
|
7
|
+
"@react-native-community/datetimepicker": "8.4.3",
|
|
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": "4.5.
|
|
10
|
+
"@react-native-community/slider": "4.5.7",
|
|
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",
|
|
14
|
-
"@stripe/stripe-react-native": "0.
|
|
15
|
-
"eslint-config-expo": "9.3.0-canary-
|
|
14
|
+
"@stripe/stripe-react-native": "0.50.1",
|
|
15
|
+
"eslint-config-expo": "9.3.0-canary-20250729-d8899ae",
|
|
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": "7.2.5-canary-
|
|
20
|
-
"expo-application": "6.1.6-canary-
|
|
21
|
-
"expo-asset": "11.2.0-canary-
|
|
22
|
-
"expo-audio": "0.4.9-canary-
|
|
23
|
-
"expo-auth-session": "6.1.6-canary-
|
|
24
|
-
"expo-av": "15.1.8-canary-
|
|
25
|
-
"expo-background-fetch": "13.1.7-canary-
|
|
26
|
-
"expo-background-task": "0.2.9-canary-
|
|
27
|
-
"expo-battery": "9.1.5-canary-
|
|
28
|
-
"expo-blur": "14.1.6-canary-
|
|
29
|
-
"expo-brightness": "13.1.5-canary-
|
|
30
|
-
"expo-build-properties": "0.15.0-canary-
|
|
31
|
-
"expo-calendar": "14.1.5-canary-
|
|
32
|
-
"expo-camera": "16.
|
|
33
|
-
"expo-cellular": "7.1.6-canary-
|
|
34
|
-
"expo-checkbox": "4.1.5-canary-
|
|
35
|
-
"expo-clipboard": "7.1.6-canary-
|
|
36
|
-
"expo-constants": "17.1.8-canary-
|
|
37
|
-
"expo-contacts": "14.2.6-canary-
|
|
38
|
-
"expo-crypto": "14.1.6-canary-
|
|
39
|
-
"expo-dev-client": "5.1.9-canary-
|
|
40
|
-
"expo-device": "7.1.5-canary-
|
|
41
|
-
"expo-document-picker": "14.0.0-canary-
|
|
42
|
-
"expo-file-system": "18.2.0-canary-
|
|
43
|
-
"expo-font": "13.4.0-canary-
|
|
44
|
-
"expo-gl": "15.1.8-canary-
|
|
19
|
+
"expo-apple-authentication": "7.2.5-canary-20250729-d8899ae",
|
|
20
|
+
"expo-application": "6.1.6-canary-20250729-d8899ae",
|
|
21
|
+
"expo-asset": "11.2.0-canary-20250729-d8899ae",
|
|
22
|
+
"expo-audio": "0.4.9-canary-20250729-d8899ae",
|
|
23
|
+
"expo-auth-session": "6.1.6-canary-20250729-d8899ae",
|
|
24
|
+
"expo-av": "15.1.8-canary-20250729-d8899ae",
|
|
25
|
+
"expo-background-fetch": "13.1.7-canary-20250729-d8899ae",
|
|
26
|
+
"expo-background-task": "0.2.9-canary-20250729-d8899ae",
|
|
27
|
+
"expo-battery": "9.1.5-canary-20250729-d8899ae",
|
|
28
|
+
"expo-blur": "14.1.6-canary-20250729-d8899ae",
|
|
29
|
+
"expo-brightness": "13.1.5-canary-20250729-d8899ae",
|
|
30
|
+
"expo-build-properties": "0.15.0-canary-20250729-d8899ae",
|
|
31
|
+
"expo-calendar": "14.1.5-canary-20250729-d8899ae",
|
|
32
|
+
"expo-camera": "16.2.0-canary-20250729-d8899ae",
|
|
33
|
+
"expo-cellular": "7.1.6-canary-20250729-d8899ae",
|
|
34
|
+
"expo-checkbox": "4.1.5-canary-20250729-d8899ae",
|
|
35
|
+
"expo-clipboard": "7.1.6-canary-20250729-d8899ae",
|
|
36
|
+
"expo-constants": "17.1.8-canary-20250729-d8899ae",
|
|
37
|
+
"expo-contacts": "14.2.6-canary-20250729-d8899ae",
|
|
38
|
+
"expo-crypto": "14.1.6-canary-20250729-d8899ae",
|
|
39
|
+
"expo-dev-client": "5.1.9-canary-20250729-d8899ae",
|
|
40
|
+
"expo-device": "7.1.5-canary-20250729-d8899ae",
|
|
41
|
+
"expo-document-picker": "14.0.0-canary-20250729-d8899ae",
|
|
42
|
+
"expo-file-system": "18.2.0-canary-20250729-d8899ae",
|
|
43
|
+
"expo-font": "13.4.0-canary-20250729-d8899ae",
|
|
44
|
+
"expo-gl": "15.1.8-canary-20250729-d8899ae",
|
|
45
45
|
"expo-google-app-auth": "~8.3.0",
|
|
46
|
-
"expo-haptics": "14.1.5-canary-
|
|
47
|
-
"expo-image": "2.5.0-canary-
|
|
48
|
-
"expo-image-loader": "5.1.1-canary-
|
|
49
|
-
"expo-image-manipulator": "13.1.8-canary-
|
|
50
|
-
"expo-image-picker": "17.0.0-canary-
|
|
51
|
-
"expo-intent-launcher": "13.0.0-canary-
|
|
52
|
-
"expo-insights": "0.9.4-canary-
|
|
53
|
-
"expo-keep-awake": "14.1.5-canary-
|
|
54
|
-
"expo-linear-gradient": "14.1.6-canary-
|
|
55
|
-
"expo-linking": "7.1.8-canary-
|
|
56
|
-
"expo-local-authentication": "16.1.0-canary-
|
|
57
|
-
"expo-localization": "16.2.0-canary-
|
|
58
|
-
"expo-location": "18.1.7-canary-
|
|
59
|
-
"expo-mail-composer": "14.1.6-canary-
|
|
60
|
-
"expo-manifests": "0.17.0-canary-
|
|
61
|
-
"expo-maps": "0.10.1-canary-
|
|
62
|
-
"expo-media-library": "18.0.0-canary-
|
|
63
|
-
"expo-mesh-gradient": "0.4.0-canary-
|
|
64
|
-
"expo-module-template": "10.16.8-canary-
|
|
65
|
-
"expo-modules-core": "2.6.0-canary-
|
|
66
|
-
"expo-navigation-bar": "4.2.8-canary-
|
|
67
|
-
"expo-network": "7.1.6-canary-
|
|
68
|
-
"expo-notifications": "0.31.5-canary-
|
|
69
|
-
"expo-print": "14.1.5-canary-
|
|
70
|
-
"expo-live-photo": "0.1.5-canary-
|
|
71
|
-
"expo-router": "5.2.0-canary-
|
|
72
|
-
"expo-screen-capture": "7.
|
|
73
|
-
"expo-screen-orientation": "8.1.8-canary-
|
|
74
|
-
"expo-secure-store": "14.2.4-canary-
|
|
75
|
-
"expo-sensors": "14.1.5-canary-
|
|
76
|
-
"expo-sharing": "13.1.6-canary-
|
|
77
|
-
"expo-sms": "13.1.5-canary-
|
|
78
|
-
"expo-speech": "13.2.0-canary-
|
|
79
|
-
"expo-splash-screen": "0.30.11-canary-
|
|
80
|
-
"expo-sqlite": "15.2.15-canary-
|
|
81
|
-
"expo-status-bar": "2.2.4-canary-
|
|
82
|
-
"expo-store-review": "8.1.6-canary-
|
|
83
|
-
"expo-symbols": "0.4.6-canary-
|
|
84
|
-
"expo-system-ui": "5.0.11-canary-
|
|
85
|
-
"expo-task-manager": "13.1.7-canary-
|
|
86
|
-
"expo-tracking-transparency": "5.2.5-canary-
|
|
87
|
-
"expo-updates": "0.29.0-canary-
|
|
88
|
-
"expo-video-thumbnails": "9.1.4-canary-
|
|
89
|
-
"expo-video": "
|
|
90
|
-
"expo-web-browser": "14.1.7-canary-
|
|
91
|
-
"jest-expo": "54.0.0-canary-
|
|
46
|
+
"expo-haptics": "14.1.5-canary-20250729-d8899ae",
|
|
47
|
+
"expo-image": "2.5.0-canary-20250729-d8899ae",
|
|
48
|
+
"expo-image-loader": "5.1.1-canary-20250729-d8899ae",
|
|
49
|
+
"expo-image-manipulator": "13.1.8-canary-20250729-d8899ae",
|
|
50
|
+
"expo-image-picker": "17.0.0-canary-20250729-d8899ae",
|
|
51
|
+
"expo-intent-launcher": "13.0.0-canary-20250729-d8899ae",
|
|
52
|
+
"expo-insights": "0.9.4-canary-20250729-d8899ae",
|
|
53
|
+
"expo-keep-awake": "14.1.5-canary-20250729-d8899ae",
|
|
54
|
+
"expo-linear-gradient": "14.1.6-canary-20250729-d8899ae",
|
|
55
|
+
"expo-linking": "7.1.8-canary-20250729-d8899ae",
|
|
56
|
+
"expo-local-authentication": "16.1.0-canary-20250729-d8899ae",
|
|
57
|
+
"expo-localization": "16.2.0-canary-20250729-d8899ae",
|
|
58
|
+
"expo-location": "18.1.7-canary-20250729-d8899ae",
|
|
59
|
+
"expo-mail-composer": "14.1.6-canary-20250729-d8899ae",
|
|
60
|
+
"expo-manifests": "0.17.0-canary-20250729-d8899ae",
|
|
61
|
+
"expo-maps": "0.10.1-canary-20250729-d8899ae",
|
|
62
|
+
"expo-media-library": "18.0.0-canary-20250729-d8899ae",
|
|
63
|
+
"expo-mesh-gradient": "0.4.0-canary-20250729-d8899ae",
|
|
64
|
+
"expo-module-template": "10.16.8-canary-20250729-d8899ae",
|
|
65
|
+
"expo-modules-core": "2.6.0-canary-20250729-d8899ae",
|
|
66
|
+
"expo-navigation-bar": "4.2.8-canary-20250729-d8899ae",
|
|
67
|
+
"expo-network": "7.1.6-canary-20250729-d8899ae",
|
|
68
|
+
"expo-notifications": "0.31.5-canary-20250729-d8899ae",
|
|
69
|
+
"expo-print": "14.1.5-canary-20250729-d8899ae",
|
|
70
|
+
"expo-live-photo": "0.1.5-canary-20250729-d8899ae",
|
|
71
|
+
"expo-router": "5.2.0-canary-20250729-d8899ae",
|
|
72
|
+
"expo-screen-capture": "7.3.0-canary-20250729-d8899ae",
|
|
73
|
+
"expo-screen-orientation": "8.1.8-canary-20250729-d8899ae",
|
|
74
|
+
"expo-secure-store": "14.2.4-canary-20250729-d8899ae",
|
|
75
|
+
"expo-sensors": "14.1.5-canary-20250729-d8899ae",
|
|
76
|
+
"expo-sharing": "13.1.6-canary-20250729-d8899ae",
|
|
77
|
+
"expo-sms": "13.1.5-canary-20250729-d8899ae",
|
|
78
|
+
"expo-speech": "13.2.0-canary-20250729-d8899ae",
|
|
79
|
+
"expo-splash-screen": "0.30.11-canary-20250729-d8899ae",
|
|
80
|
+
"expo-sqlite": "15.2.15-canary-20250729-d8899ae",
|
|
81
|
+
"expo-status-bar": "2.2.4-canary-20250729-d8899ae",
|
|
82
|
+
"expo-store-review": "8.1.6-canary-20250729-d8899ae",
|
|
83
|
+
"expo-symbols": "0.4.6-canary-20250729-d8899ae",
|
|
84
|
+
"expo-system-ui": "5.0.11-canary-20250729-d8899ae",
|
|
85
|
+
"expo-task-manager": "13.1.7-canary-20250729-d8899ae",
|
|
86
|
+
"expo-tracking-transparency": "5.2.5-canary-20250729-d8899ae",
|
|
87
|
+
"expo-updates": "0.29.0-canary-20250729-d8899ae",
|
|
88
|
+
"expo-video-thumbnails": "9.1.4-canary-20250729-d8899ae",
|
|
89
|
+
"expo-video": "3.0.0-canary-20250729-d8899ae",
|
|
90
|
+
"expo-web-browser": "14.1.7-canary-20250729-d8899ae",
|
|
91
|
+
"jest-expo": "54.0.0-canary-20250729-d8899ae",
|
|
92
92
|
"react": "19.1.0",
|
|
93
93
|
"react-dom": "19.1.0",
|
|
94
94
|
"react-native": "0.80.1",
|
|
@@ -98,15 +98,16 @@
|
|
|
98
98
|
"react-native-get-random-values": "~1.11.0",
|
|
99
99
|
"react-native-keyboard-controller": "1.17.5",
|
|
100
100
|
"react-native-maps": "1.20.1",
|
|
101
|
-
"react-native-pager-view": "6.
|
|
102
|
-
"react-native-
|
|
101
|
+
"react-native-pager-view": "6.8.1",
|
|
102
|
+
"react-native-worklets": "~0.4.0",
|
|
103
|
+
"react-native-reanimated": "~4.0.1",
|
|
103
104
|
"react-native-screens": "~4.11.1",
|
|
104
105
|
"react-native-safe-area-context": "5.4.0",
|
|
105
106
|
"react-native-svg": "15.12.0",
|
|
106
107
|
"react-native-view-shot": "4.0.3",
|
|
107
108
|
"react-native-webview": "13.13.5",
|
|
108
109
|
"sentry-expo": "~7.0.0",
|
|
109
|
-
"unimodules-app-loader": "5.1.4-canary-
|
|
110
|
+
"unimodules-app-loader": "5.1.4-canary-20250729-d8899ae",
|
|
110
111
|
"unimodules-image-loader-interface": "~6.1.0",
|
|
111
112
|
"@shopify/react-native-skia": "v2.0.0-next.4",
|
|
112
113
|
"@shopify/flash-list": "1.8.3",
|
|
@@ -11,7 +11,7 @@ import ReactAppDependencyProvider
|
|
|
11
11
|
Keep functions and markers in sync with https://developer.apple.com/documentation/uikit/uiapplicationdelegate
|
|
12
12
|
*/
|
|
13
13
|
@objc(EXExpoAppDelegate)
|
|
14
|
-
open class ExpoAppDelegate: NSObject, ReactNativeFactoryProvider, UIApplicationDelegate {
|
|
14
|
+
open class ExpoAppDelegate: NSObject, @preconcurrency ReactNativeFactoryProvider, UIApplicationDelegate {
|
|
15
15
|
@objc public var factory: RCTReactNativeFactory?
|
|
16
16
|
private let defaultModuleName = "main"
|
|
17
17
|
private let defaultInitialProps = [AnyHashable: Any]()
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import React_RCTAppDelegate
|
|
4
4
|
|
|
5
|
-
public class ExpoReactNativeFactory: RCTReactNativeFactory {
|
|
5
|
+
@MainActor public class ExpoReactNativeFactory: RCTReactNativeFactory {
|
|
6
6
|
private let reactDelegate = ExpoReactDelegate(handlers: ExpoAppDelegateSubscriberRepository.reactDelegateHandlers)
|
|
7
7
|
|
|
8
8
|
@objc func createRCTRootViewFactory() -> RCTRootViewFactory {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
@objc(EXFetchCustomExtension)
|
|
7
7
|
public class ExpoFetchCustomExtension: NSObject {
|
|
8
|
-
@objc
|
|
8
|
+
@MainActor @objc
|
|
9
9
|
public static func setCustomURLSessionConfigurationProvider(_ provider: NSURLSessionConfigurationProvider?) {
|
|
10
10
|
urlSessionConfigurationProvider = provider
|
|
11
11
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Copyright 2015-present 650 Industries. All rights reserved.
|
|
2
2
|
|
|
3
|
-
import ExpoModulesCore
|
|
3
|
+
@preconcurrency import ExpoModulesCore
|
|
4
4
|
|
|
5
5
|
private let fetchRequestQueue = DispatchQueue(label: "expo.modules.fetch.RequestQueue")
|
|
6
|
-
internal var urlSessionConfigurationProvider: NSURLSessionConfigurationProvider?
|
|
6
|
+
@MainActor internal var urlSessionConfigurationProvider: NSURLSessionConfigurationProvider?
|
|
7
7
|
|
|
8
|
-
public final class ExpoFetchModule: Module {
|
|
8
|
+
@MainActor public final class ExpoFetchModule: @preconcurrency Module {
|
|
9
9
|
private lazy var urlSession = createURLSession()
|
|
10
10
|
private let urlSessionDelegate: URLSessionSessionDelegateProxy
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@ import ExpoModulesCore
|
|
|
5
5
|
/**
|
|
6
6
|
An URLSessionDataTask wrapper.
|
|
7
7
|
*/
|
|
8
|
-
internal final class ExpoURLSessionTask: NSObject, URLSessionTaskDelegate, URLSessionDataDelegate {
|
|
8
|
+
internal final class ExpoURLSessionTask: NSObject, URLSessionTaskDelegate, URLSessionDataDelegate, @unchecked Sendable {
|
|
9
9
|
private let delegate: ExpoURLSessionTaskDelegate
|
|
10
10
|
private var task: URLSessionDataTask?
|
|
11
11
|
|
|
@@ -88,7 +88,7 @@ internal final class ExpoURLSessionTask: NSObject, URLSessionTaskDelegate, URLSe
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
internal protocol ExpoURLSessionTaskDelegate: AnyObject {
|
|
91
|
+
internal protocol ExpoURLSessionTaskDelegate: AnyObject, Sendable {
|
|
92
92
|
func urlSessionDidStart(_ session: ExpoURLSessionTask)
|
|
93
93
|
func urlSession(_ session: ExpoURLSessionTask, didReceive response: URLResponse)
|
|
94
94
|
func urlSession(_ session: ExpoURLSessionTask, didReceive data: Data)
|
|
@@ -5,7 +5,7 @@ import ExpoModulesCore
|
|
|
5
5
|
/**
|
|
6
6
|
A SharedObject for request.
|
|
7
7
|
*/
|
|
8
|
-
internal final class NativeRequest: SharedObject {
|
|
8
|
+
internal final class NativeRequest: SharedObject, @unchecked Sendable {
|
|
9
9
|
internal let response: NativeResponse
|
|
10
10
|
internal let task: ExpoURLSessionTask
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@ import ExpoModulesCore
|
|
|
5
5
|
/**
|
|
6
6
|
A SharedObject for response.
|
|
7
7
|
*/
|
|
8
|
-
internal final class NativeResponse: SharedObject, ExpoURLSessionTaskDelegate {
|
|
8
|
+
internal final class NativeResponse: SharedObject, ExpoURLSessionTaskDelegate, @unchecked Sendable {
|
|
9
9
|
internal let sink: ResponseSink
|
|
10
10
|
|
|
11
11
|
private let dispatchQueue: DispatchQueue
|
|
@@ -72,7 +72,7 @@ internal final class NativeResponse: SharedObject, ExpoURLSessionTaskDelegate {
|
|
|
72
72
|
/**
|
|
73
73
|
Waits for given states and when it meets the requirement, executes the callback.
|
|
74
74
|
*/
|
|
75
|
-
func waitFor(states: [ResponseState], callback: @escaping (ResponseState) -> Void) {
|
|
75
|
+
func waitFor(states: [ResponseState], callback: @escaping @Sendable (ResponseState) -> Void) {
|
|
76
76
|
if states.contains(state) {
|
|
77
77
|
callback(state)
|
|
78
78
|
return
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo",
|
|
3
|
-
"version": "54.0.0-canary-
|
|
3
|
+
"version": "54.0.0-canary-20250729-d8899ae",
|
|
4
4
|
"description": "The Expo SDK",
|
|
5
5
|
"main": "src/Expo.ts",
|
|
6
6
|
"module": "src/Expo.ts",
|
|
@@ -73,20 +73,21 @@
|
|
|
73
73
|
"homepage": "https://github.com/expo/expo/tree/main/packages/expo",
|
|
74
74
|
"dependencies": {
|
|
75
75
|
"@babel/runtime": "^7.20.0",
|
|
76
|
-
"@expo/cli": "1.0.0-canary-
|
|
77
|
-
"@expo/config": "11.0.14-canary-
|
|
78
|
-
"@expo/config-plugins": "10.0
|
|
79
|
-
"@expo/fingerprint": "0.13.5-canary-
|
|
80
|
-
"@expo/metro
|
|
76
|
+
"@expo/cli": "1.0.0-canary-20250729-d8899ae",
|
|
77
|
+
"@expo/config": "11.0.14-canary-20250729-d8899ae",
|
|
78
|
+
"@expo/config-plugins": "10.2.0-canary-20250729-d8899ae",
|
|
79
|
+
"@expo/fingerprint": "0.13.5-canary-20250729-d8899ae",
|
|
80
|
+
"@expo/metro": "~0.1.0",
|
|
81
|
+
"@expo/metro-config": "0.21.0-canary-20250729-d8899ae",
|
|
81
82
|
"@expo/vector-icons": "^14.0.0",
|
|
82
|
-
"babel-preset-expo": "13.3.0-canary-
|
|
83
|
-
"expo-asset": "11.2.0-canary-
|
|
84
|
-
"expo-constants": "17.1.8-canary-
|
|
85
|
-
"expo-file-system": "18.2.0-canary-
|
|
86
|
-
"expo-font": "13.4.0-canary-
|
|
87
|
-
"expo-keep-awake": "14.1.5-canary-
|
|
88
|
-
"expo-modules-autolinking": "2.2.0-canary-
|
|
89
|
-
"expo-modules-core": "2.6.0-canary-
|
|
83
|
+
"babel-preset-expo": "13.3.0-canary-20250729-d8899ae",
|
|
84
|
+
"expo-asset": "11.2.0-canary-20250729-d8899ae",
|
|
85
|
+
"expo-constants": "17.1.8-canary-20250729-d8899ae",
|
|
86
|
+
"expo-file-system": "18.2.0-canary-20250729-d8899ae",
|
|
87
|
+
"expo-font": "13.4.0-canary-20250729-d8899ae",
|
|
88
|
+
"expo-keep-awake": "14.1.5-canary-20250729-d8899ae",
|
|
89
|
+
"expo-modules-autolinking": "2.2.0-canary-20250729-d8899ae",
|
|
90
|
+
"expo-modules-core": "2.6.0-canary-20250729-d8899ae",
|
|
90
91
|
"pretty-format": "^29.7.0",
|
|
91
92
|
"react-native-edge-to-edge": "1.6.0",
|
|
92
93
|
"whatwg-url-without-unicode": "8.0.0-3"
|
|
@@ -95,7 +96,7 @@
|
|
|
95
96
|
"@types/node": "^22.14.0",
|
|
96
97
|
"@types/react": "~19.0.10",
|
|
97
98
|
"@types/react-test-renderer": "^19.1.0",
|
|
98
|
-
"expo-module-scripts": "4.1.10-canary-
|
|
99
|
+
"expo-module-scripts": "4.1.10-canary-20250729-d8899ae",
|
|
99
100
|
"react": "19.1.0",
|
|
100
101
|
"react-dom": "19.1.0",
|
|
101
102
|
"react-native": "0.80.1",
|
|
@@ -103,8 +104,8 @@
|
|
|
103
104
|
"ws": "^8.18.0"
|
|
104
105
|
},
|
|
105
106
|
"peerDependencies": {
|
|
106
|
-
"@expo/dom-webview": "0.1.6-canary-
|
|
107
|
-
"@expo/metro-runtime": "6.0.0-canary-
|
|
107
|
+
"@expo/dom-webview": "0.1.6-canary-20250729-d8899ae",
|
|
108
|
+
"@expo/metro-runtime": "6.0.0-canary-20250729-d8899ae",
|
|
108
109
|
"metro-runtime": "*",
|
|
109
110
|
"react": "*",
|
|
110
111
|
"react-refresh": "*",
|
package/src/async-require/hmr.ts
CHANGED
|
@@ -8,8 +8,7 @@
|
|
|
8
8
|
* Based on this but with web support:
|
|
9
9
|
* https://github.com/facebook/react-native/blob/086714b02b0fb838dee5a66c5bcefe73b53cf3df/Libraries/Utilities/HMRClient.js
|
|
10
10
|
*/
|
|
11
|
-
|
|
12
|
-
import MetroHMRClient from 'metro-runtime/src/modules/HMRClient';
|
|
11
|
+
import MetroHMRClient from '@expo/metro/metro-runtime/modules/HMRClient';
|
|
13
12
|
import prettyFormat, { plugins } from 'pretty-format';
|
|
14
13
|
import { DeviceEventEmitter } from 'react-native';
|
|
15
14
|
|
package/src/winter/FormData.ts
CHANGED
|
@@ -74,15 +74,7 @@ function normalizeArgs(
|
|
|
74
74
|
): [string, File | string] {
|
|
75
75
|
if (value instanceof Blob) {
|
|
76
76
|
// @ts-expect-error: `Blob.data.blobId` is react-native's proprietary property.
|
|
77
|
-
|
|
78
|
-
// For react-native created Blob objects,
|
|
79
|
-
// we need to keep its original form as-is without breaking functionality.
|
|
80
|
-
// However, we need to pass `name` for our file name handling.
|
|
81
|
-
// @ts-expect-error: Mutating the Blob object to add the `name` property.
|
|
82
|
-
value.name = blobFilename ?? 'blob';
|
|
83
|
-
} else {
|
|
84
|
-
value = { type: value.type, name: blobFilename ?? 'blob', blob: value };
|
|
85
|
-
}
|
|
77
|
+
value.name = blobFilename ?? blob.name ?? 'blob';
|
|
86
78
|
} else if (typeof value !== 'object') {
|
|
87
79
|
value = String(value);
|
|
88
80
|
}
|
|
@@ -31,6 +31,20 @@ export async function convertReadableStreamToUint8ArrayAsync(
|
|
|
31
31
|
return result;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
// Also accept instances that don't extend blob but have required methods (for filesystem and custom blob module)
|
|
35
|
+
function isBlob(obj: any): obj is Blob {
|
|
36
|
+
if (typeof obj !== 'object') {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (!('arrayBuffer' in obj)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
if (!('type' in obj)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
|
|
34
48
|
/**
|
|
35
49
|
* Normalize a BodyInit object to a Uint8Array for NativeRequest
|
|
36
50
|
*/
|
|
@@ -54,7 +68,7 @@ export async function normalizeBodyInitAsync(
|
|
|
54
68
|
return { body: new Uint8Array(body.buffer, body.byteOffset, body.byteLength) };
|
|
55
69
|
}
|
|
56
70
|
|
|
57
|
-
if (body instanceof Blob) {
|
|
71
|
+
if (body instanceof Blob || isBlob(body)) {
|
|
58
72
|
return {
|
|
59
73
|
body: new Uint8Array(await blobToArrayBufferAsync(body)),
|
|
60
74
|
overriddenHeaders: [['Content-Type', body.type]],
|
|
@@ -59,9 +59,7 @@ describe(convertFormDataAsync, () => {
|
|
|
59
59
|
it(`should convert expo-file-system FileBlob`, async () => {
|
|
60
60
|
const formData = new ExpoFormData();
|
|
61
61
|
const mockFileBlob = {
|
|
62
|
-
|
|
63
|
-
bytes: () => new Uint8Array([65, 66, 67]),
|
|
64
|
-
},
|
|
62
|
+
bytes: () => new Uint8Array([65, 66, 67]),
|
|
65
63
|
};
|
|
66
64
|
// @ts-ignore
|
|
67
65
|
formData.append('blob', mockFileBlob);
|
|
@@ -1,4 +1,33 @@
|
|
|
1
1
|
import { blobToArrayBufferAsync } from '../../utils/blobUtils';
|
|
2
|
+
import { type ExpoFormDataValue } from '../FormData';
|
|
3
|
+
|
|
4
|
+
function encodeFilename(filename: string): string {
|
|
5
|
+
return encodeURIComponent(filename.replace(/\//g, '_'));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
type ExpoFormHeaders = {
|
|
9
|
+
'content-disposition': string | undefined;
|
|
10
|
+
'content-type': string | undefined;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
function getFormDataPartHeaders(part: ExpoFormDataValue, name: string) {
|
|
14
|
+
const contentDisposition = 'form-data; name="' + name + '"';
|
|
15
|
+
|
|
16
|
+
const headers: ExpoFormHeaders = {
|
|
17
|
+
'content-disposition': contentDisposition,
|
|
18
|
+
'content-type': undefined,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
if (typeof part === 'object') {
|
|
22
|
+
if ('name' in part && typeof part.name === 'string') {
|
|
23
|
+
headers['content-disposition'] += `; filename="${encodeFilename(part.name)}"`;
|
|
24
|
+
}
|
|
25
|
+
if ('type' in part && typeof part.type === 'string') {
|
|
26
|
+
headers['content-type'] = part.type;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return headers;
|
|
30
|
+
}
|
|
2
31
|
|
|
3
32
|
/**
|
|
4
33
|
* Convert FormData to Uint8Array with a boundary
|
|
@@ -10,40 +39,40 @@ export async function convertFormDataAsync(
|
|
|
10
39
|
formData: FormData,
|
|
11
40
|
boundary: string = createBoundary()
|
|
12
41
|
): Promise<{ body: Uint8Array; boundary: string }> {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
42
|
+
if (typeof formData.entries !== 'function') {
|
|
43
|
+
// @ts-expect-error: React Native's FormData is not 100% compatible with ours
|
|
44
|
+
if (typeof formData.getParts == 'function') {
|
|
45
|
+
formData.entries = function () {
|
|
46
|
+
// @ts-expect-error
|
|
47
|
+
return formData.getParts().map((part) => {
|
|
48
|
+
if (part.string) return part.string;
|
|
49
|
+
if (part.file) return part.file;
|
|
50
|
+
if (part.blob) return part.blob;
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
} else {
|
|
54
|
+
throw new Error('Unsupported FormData implementation');
|
|
55
|
+
}
|
|
16
56
|
}
|
|
17
57
|
// @ts-expect-error: React Native's FormData is not 100% compatible with ours
|
|
18
|
-
const
|
|
58
|
+
const entries: [string, ExpoFormDataValue][] = formData.entries();
|
|
19
59
|
|
|
20
60
|
const results: (Uint8Array | string)[] = [];
|
|
21
|
-
for (const entry of
|
|
61
|
+
for (const [name, entry] of entries) {
|
|
22
62
|
results.push(`--${boundary}\r\n`);
|
|
23
|
-
for (const [headerKey, headerValue] of Object.entries(entry
|
|
24
|
-
|
|
63
|
+
for (const [headerKey, headerValue] of Object.entries(getFormDataPartHeaders(entry, name))) {
|
|
64
|
+
if (headerValue) {
|
|
65
|
+
results.push(`${headerKey}: ${headerValue}\r\n`);
|
|
66
|
+
}
|
|
25
67
|
}
|
|
26
68
|
results.push(`\r\n`);
|
|
27
|
-
if ('string'
|
|
28
|
-
results.push(entry
|
|
29
|
-
} else if (
|
|
30
|
-
results.push(entry
|
|
31
|
-
} else if ('
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// When `FormData.getParts()` is called, React Native will use the spread syntax to copy the object and lose the Blob type info.
|
|
35
|
-
// We should find the original Blob instance from the `FormData._parts` internal properties.
|
|
36
|
-
// @ts-expect-error: react-native's proprietary Blob type
|
|
37
|
-
const formDatum = formData._parts?.find(
|
|
38
|
-
([_name, value]: [name: string, value: any]) => value.data?.blobId === entry._data.blobId
|
|
39
|
-
);
|
|
40
|
-
if (formDatum == null) {
|
|
41
|
-
throw new Error('Cannot find the original Blob instance from FormData');
|
|
42
|
-
}
|
|
43
|
-
if (!(formDatum[1] instanceof Blob)) {
|
|
44
|
-
throw new Error('Unexpected value type for Blob entry in FormData');
|
|
45
|
-
}
|
|
46
|
-
results.push(new Uint8Array(await blobToArrayBufferAsync(formDatum[1])));
|
|
69
|
+
if (typeof entry === 'string') {
|
|
70
|
+
results.push(entry);
|
|
71
|
+
} else if (entry instanceof Blob) {
|
|
72
|
+
results.push(new Uint8Array(await blobToArrayBufferAsync(entry)));
|
|
73
|
+
} else if (typeof entry === 'object' && 'bytes' in entry) {
|
|
74
|
+
// @ts-expect-error: File or ExpoBlob don't extend Blob but implement the interface.
|
|
75
|
+
results.push(await entry.bytes());
|
|
47
76
|
} else {
|
|
48
77
|
throw new Error('Unsupported FormDataPart implementation');
|
|
49
78
|
}
|