Skip to content

[pull] main from expo:main#838

Merged
pull[bot] merged 20 commits intocode:mainfrom
expo:main
May 6, 2026
Merged

[pull] main from expo:main#838
pull[bot] merged 20 commits intocode:mainfrom
expo:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 6, 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 : )

jakex7 and others added 20 commits May 6, 2026 12:00
# Why

It's hard to debug widgets without access to native logs from different
target.

# How

In debug, create a RedBox view with the error message gathered from JSC
execution

## Widgets
<img width="300" alt="image"
src="https://github.com/user-attachments/assets/c3210b38-fe43-4e53-b817-918e46e97054"
/>

## Live Activities
<img width="300" alt="image"
src="https://github.com/user-attachments/assets/e2d2cef9-2c09-400e-8217-cf8897d81cb1"
/>

# Test Plan

Make invalid widget

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

add missing doc for community bottom sheet

# How

- [docs] add `@expo/ui/community/bottom-sheet` docs and API data
- [ui] fixed regression #44642 for dynamic size bottom sheet

---------

Co-authored-by: Aman Mittal <amandeepmittal@live.com>
…s` (#45430)

# Summary

This is converted to an exact version during pack/publish, not `*`,
although it's in `peerDependencies`. We need to move these back to `*`
and instead add the `workspace:*` specifier to `devDependencies`

# 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)
…terns (#45418)

# Why

We'd like to block a few native folders from being crawled by
`metro-file-map` strategically, to make the common case for app crawling
a little faster. These have been picked to be both safe and to make most
non-monorepo/simple projects faster to start up.

Currently, after a native build the initial crawl slows down since it
includes a few native folders that can be quite heavy. However, some of
these folders are always safe to exclude, and only weren't excluded
since Metro didn't give us a way to exclude project-root-relative
folders. These are:
- `./ios/Pods/`
- `./android/app/build/`
- `./android/.gradle/`

These should always be safe to ignore since they only get created as
part of a native build and have a low chance of being accessed directly
in Metro.

> [!NOTE]
> We also considered allowing these folders to be discovered by the
on-demand filesystem. However, this seems redundant as it should always
be safe to exclude these folders, and we don't have much use for the
"partial" crawl + on-demand access otherwise.

We've also defined the previous default `blockList` inefficiently. We
should use `exclusionList` for our patterns, since it adds the default
and combines it with our patterns.

# How

- metro-config: Refactor `blockList` default config to only use
`exclusionList`
- metro-file-map: Reapply `ignore` check to directories' normal paths
- metro-config: Add `^` regexes for "ios/Pods", "android/app/build", and
"android/.gradle"
  - **Note:** These will only match and exclude them in the project root
- metro-config: Add missing exclusion for `.expo/web/cache`
- **Note:** I don't know what else we place here, but we should review
the use of this folder and consider a different place for this

# Test Plan

- Manually tested against `apps/router-e2e` and `apps/bare-expo`
- Unit test added for extra `ignore` call

# 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

`tools/src/Workspace.ts` shelled out to `yarn workspaces info` to enumerate the monorepo. The post-processing step relied on`getPackageByName`, which assumes a workspace package's directory name matches its `package.json` `name`. That assumption fails for scoped packages like `@expo/ui` (lives at `packages/expo-ui/`) and `@expo/app-integrity` — their `workspacePeerDependencies` came back empty, silently masking peer specs from `updateWorkspaceProjects` during publish.

That's why `@expo/ui@56.0.0` shipped to npm with `peerDependencies.expo = "workspace:*"` and broke installs.

## How
- Replace `yarn workspaces info` with `pnpm m ls --json --depth=-1` that constructs `WorkspacesInfo` directly from each package's `package.json`. Drops the `getPackageByName` lookup.
- Add `mismatchedWorkspacePeerDependencies` to `WorkspaceProjectInfo` (subset of`workspacePeerDependencies` whose declared range doesn't satisfy the local workspace version) and surface it in `et validate-workspace-dependencies` so stale peer pins get caught before they ship.
- New unit tests in `Workspace.test.ts` exercising the pure builder against fixture monorepos including the `@expo/ui`\-shaped dir-mismatch case.

## Test plan
`et validate-workspace-dependencies` passes
`et publish-packages --dry @expo/ui expo` produces a clean dry-run with
`peerDependencies.expo` rewritten to the new `expo` version
# Why

A recent publish shipped with `workspace:*` strings embedded in several published `package.json`'s . Each shipped because `npm pack` doesn't understand pnpm's workspace protocol and serializes the literal string into the tarball. I patched around it once with a `resolveWorkspaceSpecs` task (reverted) and won't attempt that again.

# How

`tools/src/Npm.ts`'s shell-outs migrate from `npm` to `pnpm` for the publish-path operations:

- `publishPackageAsync:` `pnpm publish`. Adds `--no-git-checks` since we already enforce via
`checkRepositoryStatus`.
- `packToTarballAsync:` `pnpm pack`resolves `workspace:` specs to concrete
versions at pack time.
- `addTagAsync` / `removeTagAsync` — `pnpm dist-tag. Added for consistency,`delegates to npm.

# Test Plan

- `pnpm pack` an expo workspace package locally and confirm the tarball's
`package.json` has no `"workspace:` substrings
- `pnpm publish --dry-run` runs `prepublishOnly`
# Why

Cleanup pass after the main pnpm migration in `Workspace.ts` and `Npm.ts`removing  yarn/npm references in tooling and one error message.

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

# How

Grepped for and removed remiaing references to yarn/npm

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

# Test Plan
# Why

`"react-native-screens": "~4.25.0-beta.1"` resolves to both beta and all
the nightly versions `4.25.0-nightly-*`. Additionally there may be
breaking changes between screens beta versions

# How

Pin the dependency to be exact version.

# Test Plan

1. Test in local project

**Note**: if user has a different `react-native-screens` version
specified in their `package.json`, two versions of screens may be
installed. However expo-doctor should detect this problem and display a
warning

# 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

Documents the TextField worklet/`ObservableState` flow on both
platforms. Stacked on top of #45424 so the doc snippets line up with the
component changes.

# How

- **[swift-ui]** Update `textfield.mdx` to cover the worklet-based
selection callback and `ObservableState` usage.
- **[jetpack-compose]** Update `textfield.mdx` and `usenativestate.mdx`
to match the Compose-side API.
- Regenerated API schema JSON with `et gdad -p @expo/ui`.

# Test Plan

Rendered docs locally and verified MDX builds without errors.

# Checklist

- [ ] 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).
- [x] 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>
#45431)

## Why

When running pod install with `EXPO_USE_PRECOMPILED_MODULES=1` with
React Native built from source, a warning about falling back to source
build for the Expo Modules is picked up as an error in EAS build logs:

```
[!] [Expo] EXPO_USE_PRECOMPILED_MODULES=1 was set, but React Native is configured to build from source (RCT_USE_PREBUILT_RNCORE is not 1). Precompiled Expo modules require the prebuilt React.xcframework, so every Expo module will be built from source for this install. To use precompiled modules, ensure `ios.buildReactNativeFromSource` is not `true` in the `expo-build-properties` plugin (the default uses the prebuilt framework), or export RCT_USE_PREBUILT_RNCORE=1 before running `pod install`.
```

This looks like the source of the error, but is actually not.

## How

This PR fixes this by changing the log from using `Pod::UI.warn` to
`Pod::UI.puts`.

## Test-plan

✅ Run builds with `EXPO_USE_PRECOMPILED_MODULES=1` and
`buildReactNativeFromSource`.

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

---------

Co-authored-by: Expo Bot <34669131+expo-bot@users.noreply.github.com>
# Why

Maestro has deprecated `--android-api-level`. Removing the
`android_api_level` param from the docs prevents new users from adopting
a deprecated option. Also updated the descriptions for other
device-related params to reference `maestro list-cloud-devices` instead
of `maestro cloud --help`.

# How

Updated the Maestro Cloud job docs in:

- `docs/pages/eas/workflows/pre-packaged-jobs.mdx`
- `docs/pages/eas/workflows/syntax.mdx`

Changes:

- Removed the `android_api_level` param from the YAML example and the
parameters table.
- Replaced `maestro cloud --help` with `maestro list-cloud-devices` for
`device_model` and `device_os`.
- Removed the trailing "Run \`maestro cloud --help\`..." sentence from
`device_locale` (locale isn't device-specific).

# Test Plan

Docs-only change; visually verified the updated sections render
correctly.

# Checklist

- [ ] 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).
- [x] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)

Signed-off-by: Ash Wu <hsatac@gmail.com>
## Why

Missing external precompiled XCFrameworks are an expected source-build
fallback when `EXPO_USE_PRECOMPILED_MODULES=1` is enabled without
matching third-party prebuild artifacts. Reporting these as CocoaPods
warnings makes successful installs look more concerning than they are.

## How

Changed the missing external prebuild message from `Pod::UI.warn` to
`Pod::UI.puts`, while keeping the fallback notice and expected tarball
path in the logs.

## Test-plan

✅ Run `EXPO_USE_PRECOMPILED_MODULES=1 pod-install` and verify that we
see the messages about 3rd party frameworks like Reanimated, RNScreens
etc is not found as XCFrameworks.

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

---------

Co-authored-by: Expo Bot <34669131+expo-bot@users.noreply.github.com>
…d deps check grace period (#45417)

# Why

We're awaiting the `DevelopmentSession` ping call on startup, which
isn't strictly necessary, as we're not relying on it being instant as
the CLI starts up (all UIs displaying its data don't treat that data as
highly accurate, as far as I know)

We can also remove the grace period of the two API calls on start up
entirely, down to a tick, since that's only relevant for testing.

# How

- Remove `await` on `DevelopmentSession` and instead run it as a
fire-and-forget
- Add cancellation for concurrent start/stop on `DevelopmentSession`
- Remove 100ms grace period for install check and instead just wait a
single tick

# Test Plan

- CI should pass unchanged / manually tested with `expo start`

# 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)
…orce exit (#45445)

# Why

Supersedes #44837

The current exit guard may still have its own timeout included in the
exit guard, and we need to wait a tick for our own timeout to drop. We
can then include timeouts in the active resources check, and hence
detect spurious timeouts and intervals properly.

# How

- Remove `Timeout` filter from active resources
- Delay next `ensureProcessExitsAfterDelay` check by a tick, so active
resources from the same tick (like the handler's own timeout) drop
- Reduce default timeout to 4s

# Test Plan

- Manually verified with `expo export` and a `setInterval` in a Metro
config

# 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)
@pull pull Bot locked and limited conversation to collaborators May 6, 2026
@pull pull Bot added the ⤵️ pull label May 6, 2026
@pull pull Bot merged commit 1c87783 into code:main May 6, 2026
1 of 2 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.