Skip to content

[pull] main from expo:main#631

Merged
pull[bot] merged 19 commits intocode:mainfrom
expo:main
Feb 26, 2026
Merged

[pull] main from expo:main#631
pull[bot] merged 19 commits intocode:mainfrom
expo:main

Conversation

@pull
Copy link

@pull pull bot commented Feb 26, 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 : )

kitten and others added 19 commits February 26, 2026 10:14
# Why

- `@expo/config-plugins` isn't a necessary import; replace with
`expo/config-plugins` like the other files
- Remove `@expo/config-types` import; `expo/config` should be used
- Open up `@expo/ui` dependency range to include patch versions, since
we can't guarantee alignment on the user's side

# Test Plan

- n/a; should build as expected

# 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)
…changes (#43451)

# Why

While the `customOptOutDirectives` are marked as unstable, they're the
most reliable and simple way to opt us out of the react-compiler
modifications for widget functions. It seems like a low-risk and optimal
way to not modify the widget functions, and seems appropriate since
they're not meant to be components, instead being just functions that
return Swift UI JSX.

# How

- Add `customOptOutDirectives` override to `react-compiler` Babel plugin
options opting out `widget` directive

# Test Plan

- Unit test checks that the compiler changes don't happen

# 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: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
… update `tools` check) (#43456)

Resolves #43448

# Why

We almost never intend to pin versions, unless some very specific
conditions make this safe. In most cases, pins are just unnecessary and
lead to unneeded duplicates.

In some conditions pins can be unsafe:
- when users depend on the same library and the library has singleton
state (or transitive, misaligned dependencies with singleton state)
- when the dependency is a native module that is likely to get
misaligned (without `autolinkingModuleResolution`)
- when it's unreasonable or hard for people to match the version range
(if it's transitive, it's unknown)
- when it's a peer dependency (it's unlikely to easily share peers with
pins)

That's a non-exhaustive list. For now, a `tools` check is added to
prevent most version pins, since it's easy for commands to accidentally
add them.

# How

- Add tools check to prevent most version pinning
- Remove pinned `react-navigation` pins in `expo-router`
- Rmeove pinned `arg` version in `expo-updates`

# Test Plan

- CI should pass; Check local `expo-router` project against latest
matching ranges (adjust range if needed to `~` or add an upper limit)

# 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)
…ckages (#43458)

# Why

We seem to be aligned on all versions and the pins here are redundant
(and shouldn't ever do anything). They used to be necessary because of
transitive dependencies and templates being misaligned on purpose, but
those aren't misaligned anymore.

The main motivation is to be able to catch duplicate issues more easily.
The lockfile changes are an easy indicator to spot misaligned versions.
Although the templates aren't actively installed in the monorepo, this
gives us an extra opportunity to spot issues, if we do have checks and
tests that install them in the monorepo in the future.

The other motivation is to reduce the maintenance burden of performing
`@react-navigation/*` upgrades, since this will then flag duplicates in
the lockfile locally while upgrading.

# How

- Remove `@react-navigation/*` pins

# Test Plan

- Check lockfile; noop changes

# 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

Brownfield CI is taking a really long time to run on GitHub Action, and
people are getting into long macOS runner queues. To avoid this, we
should migrate the existing brownfield workflows to EAS

# How

Results: 

| Platform | GitHub Actions | EAS | Improvement |
|----------|----------------|-----|------------|
| Android | 16m 8s (Debug) + 17m 3s (Release) = **33m 11s** | **10m
50s** (Debug + Release) | ~22m 21s faster |
| iOS | 48m 33s (Debug) + 41m 21s (Release) = **89m 54s** | **10m 15s**
(Debug + Release) | ~79m 39s faster |

# Test Plan

CI should be green

# 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)
…or` checks (#43461)

# Why

This was never entirely accurate (see comments on reverted conditions in
removed code) and is mostly redundant if we let `expo-doctor` include
them in the duplicates check (which is more reliable and accurate)

We shouldn't need this anymore, and it's a remaining Node.js entrypoint
into `expo-router`.

> [!WARNING]
> This has the side-effect of removing `install --fix` instructions, and
instead `expo-doctor` will point out duplicates. This is intended since
`expo-router` has direct dependencies on these packages. They shouldn't
be auto-fixed in this way.

# How

- Drop `expo-router/doctor`
- Remove `expo-router/doctor` entrypoint in CLI install checks
- Add `@react-navigation/native` and `@react-navigation/core` check to
`expo-doctor`'s duplicates check instead

# Test Plan

- Ran `expo-doctor` manually to verify
- Ran `expo install --check`

# 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

Not a test we intended to keep, that's now causing sporadic failures.
The test wasn't intended to be kept since this doesn't represent stable
functionality and is for internal usage/testing.

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

Ccache is used in both: `test-suite` and
`test-suite-brownfield-isolated`. This PR creates a composite action
which can be shared between different workflows.

# How

Adds the `setup-ccache` composite action.

# Test Plan
Green CI
…es.json` (#43465)

# Why

Follow-up to #43461

This readds recommended/bundled versions for:
- `@react-navigation/native`
- ~~`@react-navigation/bottom-tabs`~~ (Note: re-removed, misalignment
here seems partially safe)
- and; `@react-navigation/native-stack`

The motivations around keeping this out of `bundledNativeModules.json`
seem to largely be obsolete and `expo-router/doctor` will be dropped.
Instead, we should maintain a supported & tested version range of
`@react-navigation/native` in `bundledNativeModules.json`. Optimally,
this should be bumped upon upgrading by users to ensure that it aligns
with `expo-router`'s assumptions.

While `expo-router` sticks with a relatively new version, if people
explicitly use an older one, they can disable this in the install
checks. This will be necessary to add somewhere to ensure that
misalignment (without the duplicates check) becomes even less likely,
i.e. after `install --fix` no duplicate with `expo-router` should occur.

Version range is hence matched to `expo-router` not latest, but kept to
`^` to match.

This is a trade-off (if people want to stick to older versions of
`react-navigation`) which we were more permissive about in the past, but
it stops `expo-router` having a "snow-flake" setup in the monorepo, and
means we're more protected. Since we typically set recommended versions
in `bundledNativeModules.json`, this is fine.

# How

- Add `@react-navigation/native` to `bundledNativeModules.json`

# Test Plan

- Locally tested and version used in `expo/expo`

# 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)
…asyncRoutes: true` in SSR (#43446)

# Why

When serving an SSR-exported app with `asyncRoutes: true` and
`unstable_useServerRendering: true`, the browser throws `__d is not
defined` because JavaScript assets in `routes.json` are not added in the
correct order. Additionally all async chunks are loaded for every page,
defeating the purpose of enabling `asyncRoutes`.

# How

In `@expo/cli`, JavaScript artifacts are now separated into sync and
async chunks during export. Sync chunks are written to the top-level
`assets.js` in the server manifest. Async chunks are matched to their
respective HTML routes, and are written to a new per-route `assets`
field for each `htmlRoute` in the server manifest.

In `expo-server`, the top-level and per-route assets are merged
(top-level first) and passed along to the SSR rendering module
(`getStaticContent()`), which ensures that only the relevant JavaScript
assets for each route are used.

# Test Plan

- CI
- Manual testing with the Expo blog

# 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

View is getting strongly captured in some closures which keeps it's
reference alive even after React unmounts component, causing memory
leaks.

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

# How

Weakly capture view reference to prevent retain cycle when view
unmounts.
<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

Tested in NCL app with instruments.

<!--
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)
- [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)
@pull pull bot locked and limited conversation to collaborators Feb 26, 2026
@pull pull bot added the ⤵️ pull label Feb 26, 2026
@pull pull bot merged commit 810063b into code:main Feb 26, 2026
26 of 34 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.

10 participants