Skip to content

[pull] main from expo:main#891

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

[pull] main from expo:main#891
pull[bot] merged 23 commits into
code:mainfrom
expo:main

Conversation

@pull

@pull pull Bot commented May 22, 2026

Copy link
Copy Markdown

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 : )

kitten and others added 23 commits May 22, 2026 10:58
## Summary

It seems like sextant QR code rendering is broken in Zed's terminal, and
it's neither falling back to the necessary characters from a fallback
font nor rendering these block characters manually. This is still
working on Alacritty, but just not on the Zed editor's terminal anymore.

I previously tested this, but looks like this regressed and needs to be
disabled for it.

<img width="319" height="259" alt="image"
src="https://github.com/user-attachments/assets/f6e166ed-e9be-4555-9972-d4f332c78d3e"
/>

See: zed-industries/zed#50158

## 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)
## Summary

Resolves #46123
Resolves #46066
Resolves #46114

Remove stringification of `UsbmuxdPairRecord` which isn't necessary just
for a debug string (but is an object, so stringification is likely
non-sensical), but causes crashes reportedly.

## 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)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
# Why

The `does not warn about supported or unknown package` and `gracefully
handles server outages` cli tests are flakey.

1. does not warn about supported or unknown package - this test checks
for ignored `@expo-google-fonts/inter` -
https://github.com/expo/expo/blob/main/packages/%40expo/cli/src/install/utils/checkPackagesCompatibility.ts#L24
dependency
2. gracefully handles server outages - does not wait for the request to
complete

# How

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

# Test Plan

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)
## Why

#46081 added patch for Skia 2.62 precompiled, but forgot to register the
patch

## How

Registers the patch

## Test-plan

✅ Ran pnpm install and verified the patch was applied 
✅ Ran `et prebuild @shopfiy/react-native-skia --clean` and verified that
it was working
# Why



`ios.usePrecompiledModules` defaulted to false, so any project using the
plugin without explicitly setting it wrote
"EXPO_USE_PRECOMPILED_MODULES": "false" to Podfile.properties.json —
silently overriding the Podfile template's default-to-enabled behavior
(https://github.com/expo/expo/blob/main/templates/expo-template-bare-minimum/ios/Podfile#L19).


# How

align the defaults 

# Test Plan

tested locally on a fresh project

# 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)
…/metro-config` and switch to `@expo/require-utils` (#46155)

# Why

This PR moves the Metro user config resolution to `@expo/metro-config`,
since that's where it has the most context to other values (e.g. in the
transformer) that must also be set on it. It also gives a unified view
on what the config will look like in one package (apart from
CLI-specific overrides/modifications). A new `loadUserConfig` export is
now available on `@expo/metro-config`.

This also switches the user Metro config resolution to
`@expo/require-utils` to further align it with the expectations for
`@expo/config` and `@expo/config-plugins`, aligning the TS support, and
other details (like error messages).

Incidentally, however, switching this to `@expo/require-utils` means
we're:
- dropping support for the yaml format for Metro configs (was already
deprecated in Metro)
- not looking above the server root for Metro config files
(security-relevant in some cases)
- ignoring `package.json:metro` above the project root (this doesn't
make sense to support and was intentionally removed)

We're also switching `expo-doctor` to use this API, since it could
previously run into issues that `@expo/cli` wouldn't and vice-versa,
which aligns the Metro user config loading between the two via
`expo/metro-config`

# How

- Reimplement Metro config resolution with `@expo/require-utils`
- Move Metro user config loading (and normalization) to
`@expo/metro-config`
- Use `loadUserConfig` from `@expo/metro-config` in `@expo/cli` and
`expo-doctor`

> [!NOTE]
> As a follow-up, we'll be able to delete `@expo/metro-config/exports`  

# Test Plan

- Unit tests added / updated
- CI E2E tests should pass unchanged
- Manually tested a few project setups  

Resolves #46144

# 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

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->
Follow-up #46107 &
https://github.com/expo/expo/actions/runs/26288337421/job/77381564930

<img width="3518" height="904" alt="CleanShot 2026-05-22 at 18 25 50@2x"
src="https://github.com/user-attachments/assets/01c3057d-e351-4c5f-9275-5e5a9091299a"
/>



# How

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

- Fix lint-prose script to include `docs/README.md`, matching the CI
workflows patterns for Docs PR jobs.
- Ignore the keyboard rule for `docs/README.md`.

# 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.
-->

Run `pnpm lint-prose` and there should be no errors locally.

<img width="2014" height="366" alt="CleanShot 2026-05-22 at 18 25 23@2x"
src="https://github.com/user-attachments/assets/11ec97a1-746d-408a-bf38-a3b5c24e78a3"
/>


On CI, there are no errors left. The following screenshot is from the CI
run from Docs PR job in this PR:

<img width="3410" height="916" alt="CleanShot 2026-05-22 at 18 32 10@2x"
src="https://github.com/user-attachments/assets/20b0b6c2-4388-49ea-8894-24ecd3d2a676"
/>


# 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)
…45982)

# Why

Previously the Android-only `rippleColor`, `disableIndicator`, and
`labelVisibilityMode` props could only be configured globally on
`NativeTabs`. Expose an option to customize them per tab (e.g. hide the
indicator on a single tab, or change the ripple color for one screen).

# How

1. Accept `rippleColor`, `disableIndicator`, and `labelVisibilityMode`
on `NativeTabs.Trigger` and forward them through
`convertTabPropsToOptions`.
2. Keep the existing top-level props on `NativeTabs` as defaults;
per-tab values override them.

# Test Plan

1. CI
2. Manual check in router-e2e on Android

# 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: Expo Bot <34669131+expo-bot@users.noreply.github.com>
… toolbar (#46094)

# Why

When using `Stack.Toolbar.Button` or `Stack.Toolbar.Menu` with
`placement="bottom"` on iOS, passing an image to the `icon` prop (or
using `<Stack.Toolbar.Icon src={...} />`) silently renders nothing — the
native bottom toolbar only supports SF Symbols, custom `image` props, or
Xcode asset catalog images. Users get no feedback that their icon is
being dropped.

I am not happy with this API, and I plan to unify everything under
`icon`/`src` in the next release -
https://linear.app/expo/issue/ENG-21381/remove-image-prop-from-stacktoolbarbuttonmenu

# How

1. Warn in dev when `NativeToolbarButton` / `NativeToolbarMenu` receive
an image `source` in the bottom placement, pointing to the supported
alternatives (string SF Symbol, `image` prop, or `<Stack.Toolbar.Icon
xcasset="..." />`).
2. Destructure `source` on `NativeToolbarMenu` so the warning can read
it.
3. Rebuild the package sources.

# Test Plan

1. CI
2. New cases in `StackToolbarButton.test.ios.tsx` and
`StackToolbarMenu.test.ios.tsx` covering:
   - warns when `icon` prop is an image source in development
   - warns when `<StackToolbarIcon src>` child is used in development
   - does not warn in production or for non-bottom placements
3. Manual tests

<img width="707" height="75" alt="image"
src="https://github.com/user-attachments/assets/e005d378-e8ac-416f-8c8b-94351ad1f6be"
/>


# 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)
# Why

# How

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

# 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)
…scovery (#46166)

## Summary

Follow-up to #46155

- We're loading Metro configs ourselves, as of the above PR, which means
`metro.config.yml` (and similar YAML configs) will now be unsupported
and refuse to load
- Similarly, that PR is restricting config discovery to the server root
(and `package.json:metro` to the project root)

We may also want to link to our **metro.config.js** page and clarify
that we may not have perfect 1:1 coverage with every customization that
Metro usually allows

## 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)
## Summary

Follow-up to #46155

The `@expo/metro-config/exports` entrypoint was an internal re-export
for `@expo/cli` that's now obsolete after the above PR. It wasn't used
for anything else but exposing the Babel config resolution function.

## 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)
…pecified (#46096)

# Why

When specifying only the default icon for tab with role search 
```tsx
<NativeTabs.Trigger ...... role="search">
  <NativeTabs.Trigger.Icon sf="heart" />
</NativeTabs.Trigger>
```

The icon is overridden by system search icon, when tab is selected. This
is a bug in react-native-screens and not desirable behavior.

# How

When only default icon is specified, pass it to `selectedIcon` prop on
screen's `Tab.Screen`

# Test Plan

1. CI
2. Manual router-e2e tests

**Before**



https://github.com/user-attachments/assets/b5b966bb-a68b-4a02-a94f-5aaba83c9cf8



**After**



https://github.com/user-attachments/assets/5eecda69-5f53-408b-b9c5-f1a4e3480c63



# 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 22, 2026
@pull pull Bot added the ⤵️ pull label May 22, 2026
@pull pull Bot merged commit 38bbcce into code:main May 22, 2026
2 of 5 checks passed
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.

6 participants