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.
@@ -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-20250722-599a28f'
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-20250722-599a28f"
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":"AA6CA,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
+ {"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;AAkCD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,QAAQ,GAAG,OAAO,YAAY,CAkInF"}
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;AAED;;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
+ {"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":"AAEA;;;;;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
+ {"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-20250722-599a28f",
3
- "@expo/metro-runtime": "6.0.0-canary-20250722-599a28f",
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-20250722-599a28f",
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.1",
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.6",
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.45.0",
15
- "eslint-config-expo": "9.3.0-canary-20250722-599a28f",
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-20250722-599a28f",
20
- "expo-application": "6.1.6-canary-20250722-599a28f",
21
- "expo-asset": "11.2.0-canary-20250722-599a28f",
22
- "expo-audio": "0.4.9-canary-20250722-599a28f",
23
- "expo-auth-session": "6.1.6-canary-20250722-599a28f",
24
- "expo-av": "15.1.8-canary-20250722-599a28f",
25
- "expo-background-fetch": "13.1.7-canary-20250722-599a28f",
26
- "expo-background-task": "0.2.9-canary-20250722-599a28f",
27
- "expo-battery": "9.1.5-canary-20250722-599a28f",
28
- "expo-blur": "14.1.6-canary-20250722-599a28f",
29
- "expo-brightness": "13.1.5-canary-20250722-599a28f",
30
- "expo-build-properties": "0.15.0-canary-20250722-599a28f",
31
- "expo-calendar": "14.1.5-canary-20250722-599a28f",
32
- "expo-camera": "16.1.12-canary-20250722-599a28f",
33
- "expo-cellular": "7.1.6-canary-20250722-599a28f",
34
- "expo-checkbox": "4.1.5-canary-20250722-599a28f",
35
- "expo-clipboard": "7.1.6-canary-20250722-599a28f",
36
- "expo-constants": "17.1.8-canary-20250722-599a28f",
37
- "expo-contacts": "14.2.6-canary-20250722-599a28f",
38
- "expo-crypto": "14.1.6-canary-20250722-599a28f",
39
- "expo-dev-client": "5.1.9-canary-20250722-599a28f",
40
- "expo-device": "7.1.5-canary-20250722-599a28f",
41
- "expo-document-picker": "14.0.0-canary-20250722-599a28f",
42
- "expo-file-system": "18.2.0-canary-20250722-599a28f",
43
- "expo-font": "13.4.0-canary-20250722-599a28f",
44
- "expo-gl": "15.1.8-canary-20250722-599a28f",
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-20250722-599a28f",
47
- "expo-image": "2.5.0-canary-20250722-599a28f",
48
- "expo-image-loader": "5.1.1-canary-20250722-599a28f",
49
- "expo-image-manipulator": "13.1.8-canary-20250722-599a28f",
50
- "expo-image-picker": "17.0.0-canary-20250722-599a28f",
51
- "expo-intent-launcher": "13.0.0-canary-20250722-599a28f",
52
- "expo-insights": "0.9.4-canary-20250722-599a28f",
53
- "expo-keep-awake": "14.1.5-canary-20250722-599a28f",
54
- "expo-linear-gradient": "14.1.6-canary-20250722-599a28f",
55
- "expo-linking": "7.1.8-canary-20250722-599a28f",
56
- "expo-local-authentication": "16.1.0-canary-20250722-599a28f",
57
- "expo-localization": "16.2.0-canary-20250722-599a28f",
58
- "expo-location": "18.1.7-canary-20250722-599a28f",
59
- "expo-mail-composer": "14.1.6-canary-20250722-599a28f",
60
- "expo-manifests": "0.17.0-canary-20250722-599a28f",
61
- "expo-maps": "0.10.1-canary-20250722-599a28f",
62
- "expo-media-library": "18.0.0-canary-20250722-599a28f",
63
- "expo-mesh-gradient": "0.4.0-canary-20250722-599a28f",
64
- "expo-module-template": "10.16.8-canary-20250722-599a28f",
65
- "expo-modules-core": "2.6.0-canary-20250722-599a28f",
66
- "expo-navigation-bar": "4.2.8-canary-20250722-599a28f",
67
- "expo-network": "7.1.6-canary-20250722-599a28f",
68
- "expo-notifications": "0.31.5-canary-20250722-599a28f",
69
- "expo-print": "14.1.5-canary-20250722-599a28f",
70
- "expo-live-photo": "0.1.5-canary-20250722-599a28f",
71
- "expo-router": "5.2.0-canary-20250722-599a28f",
72
- "expo-screen-capture": "7.2.0-canary-20250722-599a28f",
73
- "expo-screen-orientation": "8.1.8-canary-20250722-599a28f",
74
- "expo-secure-store": "14.2.4-canary-20250722-599a28f",
75
- "expo-sensors": "14.1.5-canary-20250722-599a28f",
76
- "expo-sharing": "13.1.6-canary-20250722-599a28f",
77
- "expo-sms": "13.1.5-canary-20250722-599a28f",
78
- "expo-speech": "13.2.0-canary-20250722-599a28f",
79
- "expo-splash-screen": "0.30.11-canary-20250722-599a28f",
80
- "expo-sqlite": "15.2.15-canary-20250722-599a28f",
81
- "expo-status-bar": "2.2.4-canary-20250722-599a28f",
82
- "expo-store-review": "8.1.6-canary-20250722-599a28f",
83
- "expo-symbols": "0.4.6-canary-20250722-599a28f",
84
- "expo-system-ui": "5.0.11-canary-20250722-599a28f",
85
- "expo-task-manager": "13.1.7-canary-20250722-599a28f",
86
- "expo-tracking-transparency": "5.2.5-canary-20250722-599a28f",
87
- "expo-updates": "0.29.0-canary-20250722-599a28f",
88
- "expo-video-thumbnails": "9.1.4-canary-20250722-599a28f",
89
- "expo-video": "2.3.0-canary-20250722-599a28f",
90
- "expo-web-browser": "14.1.7-canary-20250722-599a28f",
91
- "jest-expo": "54.0.0-canary-20250722-599a28f",
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.7.1",
102
- "react-native-reanimated": "~3.18.0",
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-20250722-599a28f",
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-20250722-599a28f",
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-20250722-599a28f",
77
- "@expo/config": "11.0.14-canary-20250722-599a28f",
78
- "@expo/config-plugins": "10.0.4-canary-20250722-599a28f",
79
- "@expo/fingerprint": "0.13.5-canary-20250722-599a28f",
80
- "@expo/metro-config": "0.21.0-canary-20250722-599a28f",
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-20250722-599a28f",
83
- "expo-asset": "11.2.0-canary-20250722-599a28f",
84
- "expo-constants": "17.1.8-canary-20250722-599a28f",
85
- "expo-file-system": "18.2.0-canary-20250722-599a28f",
86
- "expo-font": "13.4.0-canary-20250722-599a28f",
87
- "expo-keep-awake": "14.1.5-canary-20250722-599a28f",
88
- "expo-modules-autolinking": "2.2.0-canary-20250722-599a28f",
89
- "expo-modules-core": "2.6.0-canary-20250722-599a28f",
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-20250722-599a28f",
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-20250722-599a28f",
107
- "@expo/metro-runtime": "6.0.0-canary-20250722-599a28f",
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": "*",
@@ -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
- // @ts-expect-error: no types for MetroHMRClient
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
 
@@ -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
- if (value.data?.blobId != null) {
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
- file: {
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
- // @ts-expect-error: React Native's FormData is not compatible with the web's FormData
14
- if (typeof formData.getParts !== 'function') {
15
- throw new Error('Unsupported FormData implementation');
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 parts: ExpoFormDataPart[] = formData.getParts();
58
+ const entries: [string, ExpoFormDataValue][] = formData.entries();
19
59
 
20
60
  const results: (Uint8Array | string)[] = [];
21
- for (const entry of parts) {
61
+ for (const [name, entry] of entries) {
22
62
  results.push(`--${boundary}\r\n`);
23
- for (const [headerKey, headerValue] of Object.entries(entry.headers)) {
24
- results.push(`${headerKey}: ${headerValue}\r\n`);
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' in entry) {
28
- results.push(entry.string);
29
- } else if ('file' in entry) {
30
- results.push(entry.file.bytes());
31
- } else if ('blob' in entry) {
32
- results.push(new Uint8Array(await blobToArrayBufferAsync(entry.blob)));
33
- } else if (entry._data?.blobId != null) {
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
  }