Skip to content

[pull] main from expo:main#900

Merged
pull[bot] merged 20 commits into
code:mainfrom
expo:main
May 25, 2026
Merged

[pull] main from expo:main#900
pull[bot] merged 20 commits into
code:mainfrom
expo:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 25, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

eliotgevers and others added 20 commits May 25, 2026 12:01
# Why

Closes #46133.

The typed `expo-widgets/plugin` helper currently requires
`supportedFamilies` to be `WidgetFamily[]`, where `WidgetFamily` is a
string enum. That means valid runtime values such as `"systemMedium"`
are rejected by TypeScript when app config uses `withWidgets(...)`.

# How

Changed the plugin's `WidgetFamily` export from a TypeScript enum to an
enum-like `as const` object plus a string-literal type.

This keeps existing enum-style usage working:

```ts
WidgetFamily.systemMedium
```

and also allows plain string values in typed config:

```ts
supportedFamilies: ["systemMedium", "systemLarge", "accessoryRectangular"]
```

Runtime validation remains unchanged because
`Object.values(WidgetFamily)` still returns the same allowed string
values.

# Test Plan

- `pnpm install --filter expo-widgets... --ignore-scripts`
- `pnpm --filter expo-widgets build:plugin`
- `pnpm --filter expo-widgets lint`
- `pnpm --filter expo-widgets test`
- Verified the issue repro before/after by copying the rebuilt
`WidgetFamily.type` output into
https://github.com/eliotgevers/expo-widget-family-repro:
  - before: `bun run typecheck` rejects string widget families
  - after: `bun run typecheck` passes
  - after: `bun run config` still loads `expo-widgets`

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

This PR adds the initial Android package for `expo-widgets`, nothing
fancy yet, just laying the foundation for widgets support.

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

Create a basic module with jetpack glance provider

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

Nothing to test yet.

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# How

- Moved config plugin to `/ios`
- Added `/android` config plugin

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

This config plugin should:

- create `widget_${widget.name}_info.xml` in `app/src/main/res/xml`
- create `${widget.name}Provider.kt` in app catalog
- add widget receiver to manifest

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
…arget (#46175)

# Why

Bumping the deployment target to 16.4 in SDK 56 is causing issues for
consumers of `ExpoModulesCore`
[issues](https://github.com/search?q=%22compiling+for+iOS+15.1%2C+but+module+%27ExpoModulesCore%27+has+a+minimum+deployment+target+of+iOS+16.4%22&type=issues)
- "Compiling for iOS 15.1, but module 'ExpoModulesCore' has a minimum
deployment target of iOS 16.4".

Usually people offer [this kind
](https://github.com/EvanBacon/expo-quick-actions/pull/58/changes#diff-e33aa8a237150b7b621dcf3d4b96411fa475be3429816ef2f12badf2512fa900L13)of
fix but that's breaking.

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

In expo-modules-autolinking's pod install post-install hook, after
CocoaPods has finished, we read ExpoModulesCore's iOS deployment target
off its already-loaded spec and raise every autolinked Expo module's
IPHONEOS_DEPLOYMENT_TARGET (and macOS/tvOS equivalents) to at least that
value if it's currently lower.

edit: RN core does similar thing
[here](https://github.com/facebook/react-native/blob/09fc0432d1eb799c3c1c2ae2ef0dc3acb2944e35/packages/react-native/scripts/cocoapods/utils.rb#L362)

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan



<details>
<summary>Details</summary>

# Autolinking fix — staged verification

> Paths in **angle brackets** below need to be filled in by you:
> - `<scratch-dir>` — any directory you don't mind creating a throwaway
project in
> - `<expo-checkout>` — your local clone of `expo/expo` with the fix
applied (e.g. the branch/PR being reviewed)

## Stage 1 — Create project and reproduce bug

```bash
cd <scratch-dir>
rm -rf deployment-target-test
npx create-expo-app@latest deployment-target-test --template default@sdk-56
cd deployment-target-test
npx expo install expo-quick-actions expo-build-properties
npx expo prebuild -p ios --clean
cd ios && pod install && cd ..
```

**Check 1:**
```bash
grep EXPO_USE_PRECOMPILED_MODULES ios/Podfile.properties.json
```
Expect: `"EXPO_USE_PRECOMPILED_MODULES": "false"` (that's another bug
resolved by #46159)

**Check 2:**
```bash
cd ios && ruby -rxcodeproj -e '
p = Xcodeproj::Project.open("Pods/Pods.xcodeproj")
%w[ExpoQuickActions ExpoModulesCore].each { |n|
  t = p.targets.find { |x| x.name == n }
  puts "#{n}: #{t.build_configurations.first.build_settings["IPHONEOS_DEPLOYMENT_TARGET"]}"
}' && cd ..
```
Expect:
```
ExpoQuickActions: 15.1
ExpoModulesCore: 16.4
```

**Check 3:**
```bash
cd ios && xcodebuild -workspace deploymenttargettest.xcworkspace \
  -scheme ExpoQuickActions -configuration Debug \
  -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' build 2>&1 \
  | grep -E "error:|BUILD (FAILED|SUCCEEDED)" | head -3
cd ..
```
Expect: `error: compiling for iOS 15.1, but module 'ExpoModulesCore' has
a minimum deployment target of iOS 16.4` + `** BUILD FAILED **`

If any check fails, stop — bug isn't reproducing.

## Stage 2 — Apply fix

```bash
cp <expo-checkout>/packages/expo-modules-autolinking/scripts/ios/autolinking_manager.rb \
   node_modules/expo-modules-autolinking/scripts/ios/autolinking_manager.rb
cp <expo-checkout>/packages/expo-modules-autolinking/scripts/ios/cocoapods/installer.rb \
   node_modules/expo-modules-autolinking/scripts/ios/cocoapods/installer.rb
```

## Stage 3 — Verify

```bash
cd ios && pod install 2>&1 | grep "Raised deployment target"
```
**Check 4** — expect: `[Expo] Raised deployment target to 16.4 for 1
Expo modules (matching ExpoModulesCore)`

**Check 5:**
```bash
ruby -rxcodeproj -e '
p = Xcodeproj::Project.open("Pods/Pods.xcodeproj")
%w[ExpoQuickActions ExpoModulesCore React-Core Yoga RCTRequired].each { |n|
  t = p.targets.find { |x| x.name == n }
  next puts "#{n}: (not found)" unless t
  puts "#{n}: #{t.build_configurations.first.build_settings["IPHONEOS_DEPLOYMENT_TARGET"]}"
}'
```
Expect:
```
ExpoQuickActions: 16.4
ExpoModulesCore: 16.4
React-Core: 15.1
Yoga: 15.1
RCTRequired: 15.1
```

**Check 6:**
```bash
xcodebuild -workspace deploymenttargettest.xcworkspace \
  -scheme ExpoQuickActions -configuration Debug \
  -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' build 2>&1 \
  | grep -E "error:|BUILD (FAILED|SUCCEEDED)" | head -3
cd ..
```
Expect: `** BUILD SUCCEEDED **`


## Pass criteria

All 6 checks match. If Check 5 shows `React-Core`/`Yoga`/`RCTRequired`
at 16.4 → filter over-broad. If Check 6 fails despite Check 5 passing →
hook ran but didn't fix root cause.


</details>

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

Add the same zstd, Brotli, and gzip response decompression support to
Android update downloads that Android fetch now uses.

# How

- same work from #45458 but for updates
- Added a local `CompressionInterceptor` for `expo-updates`, wired it
into `FileDownloader`, and updated the Android dependencies and ProGuard
keep rule for zstd.

---------

Co-authored-by: Alan Hughes <30924086+alanjhughes@users.noreply.github.com>
# Why

`ImageRef` cannot be passed to `SharedRef` as it is an instance of
`SharedRef`

# How

Use `SharedRefType`

# Test Plan

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
…are provided (#46218)

# Why
Fixes #46154

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

SwiftUI's labeled
Slider(value:in:step:label:minimumValueLabel:maximumValueLabel:onEditingChanged:)
initializer reserves a dotted line beneath the track even when all label
closures resolve to nil. SliderView.swift always called this
initializer, so every unlabeled slider got a stray gray line on iOS 17+.
Compute hasAnyLabel from the three slot() lookups in
SliderView.sliderContent and branch to the unlabeled Slider(...)
initializer when none of the slots are provided, across all four (range,
range+step, step-only, default) cases.


<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

Tested in NCL sliderscreen
<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
…46211)

Co-authored-by: Yamin Yassin <Yamin.Yassin+CAG@cagtechhub.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Why

fix precompile error for #46122

# How

add macro plugin tool to Package.swift when linking

# Test Plan

precompile ci passed

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin).
- [x] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

dogfooding OptimizedFunction

# How

- migrate randomUUID to use `@OptimizedFunction`

# Test Plan

- test `randomUUID` returns expected random uuid

- benchmark (keep the change in git history).
<img width="1205" height="751" alt="Simulator Screenshot - iPhone 17 Pro - 2026-05-22 at 03 08 23" src="https://github.com/user-attachments/assets/580790a6-2352-4493-ac5f-f6503f708df6" />


# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin).
- [x] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

The new minimum as claimed in
https://expo.dev/changelog/sdk-56-beta#tool-version-bumps is 26.4.

I'd like to bump so that CI can build some features that depend on using
xcode 26 without workarounds (not critical though in case we want to
keep mac 15 runners longer for some reason).

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

- green CI

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
…tive-C (#46227)

# Why

Host apps written in Objective-C currently can't call
`ReactNativeHostManager.shared.initialize(...)` directly. The class has
no`@objc` exposure, so integrators have been forced to add a small Swift
shim

# How

`ReactNativeHostManager` now inherits from `NSObject` and its public
surface (`shared`, `initialize(turboModuleClasses:)`, `loadView(...)`,
`cleanupPreviousInstance()`) is annotated `@objc`, so it bridges to
Objective-C without any wrapper.

# Test Plan

- Verified that an Objective-C host app can call
`[ReactNativeHostManager.shared initializeWithTurboModuleClasses:@{}]`,
`[[ReactNativeHostManager shared] loadView…]`, and
`[[ReactNativeHostManager shared] cleanupPreviousInstance]` directly,
with no Swift wrapper.
- Ran the brownfield-tester isolated iOS target
# Why

closes #44453

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

add a warning

# Test Plan

- bare expo

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

To recreate props in Widgets, we need to be able to create ComposeProps
without a view.

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

Added `createComposeProps` function

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

Not yet.

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

`shape` prop does not work on TextField. Reported by discord user
(hard265)

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

Use `parseJSXShape` to process the shape prop.
<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

Added shape example in NCL
<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)

---------

Co-authored-by: Aman Mittal <amandeepmittal@live.com>
# Why

Fix `Platform` import in `bare-expo` benchmark module.

# How

-

# Test Plan

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
@pull pull Bot locked and limited conversation to collaborators May 25, 2026
@pull pull Bot added the ⤵️ pull label May 25, 2026
@pull pull Bot merged commit a1fbfd8 into code:main May 25, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.