Skip to content

[pull] main from expo:main#756

Merged
pull[bot] merged 14 commits intocode:mainfrom
expo:main
Apr 8, 2026
Merged

[pull] main from expo:main#756
pull[bot] merged 14 commits intocode:mainfrom
expo:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull bot commented Apr 8, 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 : )

zoontek and others added 14 commits April 8, 2026 12:27
…#44584)

# Why

Related PR: #44243

On Android 12-13 (API 31-33), there's a platform bug where the splash
screen exit animation listener can fire after the activity has stopped,
causing a `SurfaceControl.checkNotReleased` crash. This is a known
Android issue: https://issuetracker.google.com/issues/242118185

# How

- Added an `ActivityLifecycleCallbacks` that cancels the splash screen
exit animation when the activity stops on API 31-33, preventing the
crash from occurring

#### Why not simply remove `setOnExitAnimationListener`?

Removing the listener entirely would fix the crash but introduce two
regressions:

1. **Forced system fade**: without the listener, the system uses its own
default fade to dismiss the splash. Users who set `fade: false` (e.g. to
animate individual splash screen parts) would see an unwanted fade
regardless.
2. **System bars race condition**: inside the listener, we call
`(splashScreenView as SplashScreenView).remove()` instead of
`splashScreenViewProvider.remove()` on API >= 31 to avoid triggering
`applyThemesSystemBarAppearance`, which races with React Native / Expo
system bar appearance management. Skipping the listener would
re-introduces this issue on Android 12-13.

**This is a mitigation, not a total fix.** The underlying bug is in the
Android platform itself and cannot be fully fixed on our side. This
change reduces the window in which the crash can occur by cancelling the
animation on activity stop, but edge cases with very tight timing may
still slip through. It should reduce error occurrences, allowing
remaining rare reports to be safely ignored.

# Test Plan

Tested on Android 12-13 devices by rapidly backgrounding the app during
splash screen animation.

# 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)
- [ ] 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 #44580

See: https://github.com/kitten/lan-network/blob/main/CHANGELOG.md#021

# Test Plan

- CI should pass unchanged

# 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

Small QoL improvement. When users post the output from `--verbose`, I'd
love to see whether they've actually run the latest version, just in
case the latest isn't resolved or a cached version is used. This makes
the output a little more trustworthy and reliable in the future.

# How

- Add `expo-doctor: v0.0.0` output to `--verbose`

# Test Plan

- Run `expo-doctor`; NOTE: There's a build error right now that'll need
to be resolved first

# 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

See:
https://github.com/kitten/fetch-nodeshim/blob/main/CHANGELOG.md#0410

# Test Plan

- CI should pass unchanged

# 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

`@expo/cli`'s internal files aren't meant to be re-used. On `main`, this
is now resulting in a build error since the `package.json:exports` don't
allow this file to be reused. Since this was always meant to be a
separate implementation, this PR adds a vendored API call for the native
modules JSON.

# How

- Add `src/api/getNativeModuleVersionsAsync.ts` with slim native modules
fetching
- Replace internal `@expo/cli` import path with it

# Test Plan

- CI should pass unchanged / manual run validates this

# 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

We must upgrade `react-native-reanimated` to version `4.3.0` to properly
support react-native `0.85.0`

# How

- Bump `react-native-reanimated` to `4.3.0`
- Bump `react-native-worklets` to `0.8.1`

# Test Plan

- BareExpo

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

# Why

I was checking if any improvements can be made to the non-interactive
mode in `create-expo-module`. I didn't really find much, I added some
tests though.

# How

Check for `EXPO_NONINTERACTIVE` just in case, add a few detection tests
to non-interactive mode.`ci === 'true' || ci?.toLowerCase() === 'true'`
can be simplified to ` ci?.toLowerCase() === 'true' `

# Test Plan

Tested on MacOS by running `yarn test:e2e`
# Summary

Resolves #44097

See:
https://github.com/kitten/dnssd-advertise/blob/main/CHANGELOG.md#114

# Test Plan

- CI should pass unchanged

# 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)
…ndle (#44559)

# Why

This adds feature parity to iOS for the `mode` parameter when opening a
file handle.
A specific use-case I intend to use this for is reading files returned
from `expo-media-library` that the app doesn't have permission to open
with write access.

# How

The change uses the same general design as
#42983 and the built-in methods on
Foundation's `FileHandle` to implement the behavior of each `FileMode`.
https://developer.apple.com/documentation/foundation/filehandle

# Test Plan

The `FileMode` tests written for #42983
now run for both iOS and Android.

# 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)
- [ ] 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>
…#44591)

# Summary

Resolves #44578
Related #41714 (changed new option on `transformer`)

The option doesn't exist on `watcher` anymore, as far as I'm aware and
should be removed

# Test Plan

- CI should pass unchanged

# 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)
…tently (#44414)

# Why

Contains/Supersedes #40563

Resolves #39738
Resolves #40837

The paths passed to `mainModuleName` have many different code paths in
which they're being resolved that are inconsistent and lead to subtle
bugs, since some are missing the fix-ups of others.

The `--entry-file` argument in React Native is generally passed as an
absolute path. However, `resolveAppEntry`, expo-updates' manifest
scripts, and other invocations may pass a relative path. This path is
generally considered to be relative to the **project root**.

The CLI sometimes interprets this as a relative path to the server root,
since that's what the output for `entryFile -> mainModuleName` has to be
converted to. This leads to confusing situations where, often
specifically on Windows, where React Native passes a relative path by
default, the resulting `mainModuleName` is incorrect when the server
root differs from the project root (monorepos)

# How

- Remove duplicate relative entrypoint conversions and duplicate
`mainModuleName` resolution implementations
- Update implementation in `@expo/config/paths` to handle relative paths
(relative to `projectRoot`) and to convert to posix paths

The exports that are re-used from `@expo/config/paths` have been marked
as deprecated since they're now internal and may be moved to
`@expo/cli`. Other duplicate helpers in `@expo/cli` have already been
deleted but we might want to do another pass on this.

# Test Plan

- We expect all tests to pass unaltered
- **Exception:** Our own CLI E2E embed tests pass an entry relative to
the server root, and have been altered since this is now expected to
fail

Some care will have to be taken when backporting this, since:
- `expo/scripts/resolveAppEntry` has been altered
- `expo-updates` has been altered but version can be misaligned
- **Note:** There's a re-export in `@expo/cli` that tries to smooth over
the inaccurate relative path that the old version passes

# 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: Cedric van Putten <github@cedric.dev>
…ng a module (#43899)

# Why

Currently `create-expo-module` always creates modules for all platforms

# How

Add `--platform` option to specify platforms supported by the module
- For local modules the creator pre-selects platforms defined in
`app.json` for the prompt
- For non local modules the creator defaults to all platforms when
unspecified
- In non-interactive mode the local module will be created for all
platforms when `--platform` is not provided
- Added tests

# Test Plan

Tested by creating a bunch of modules on MacOS, and by running the added
e2e tests
@pull pull bot locked and limited conversation to collaborators Apr 8, 2026
@pull pull bot added the ⤵️ pull label Apr 8, 2026
@pull pull bot merged commit 8a0f735 into code:main Apr 8, 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.

6 participants