Skip to content

[pull] main from expo:main#810

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

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

Conversation

@pull

@pull pull Bot commented Apr 28, 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 : )

Ubax and others added 20 commits April 28, 2026 12:05
# Why

In order to improve migration path from react-navigation we added metro
plugin to detect react-navigation usages alongside expo-router.

This however breaks in case of bare-expo, where expo-router is a
dependency only for testing native code, rather then actual usage of
expo-router.

# 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)
…iptions (#45141)

# Why

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

Fix ENG-20816

# How

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

Fix missing trailing periods to `BoxLink` and `VideoBoxLink`
descriptions in multiple docs.

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

N/A

# 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

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

Fix ENG-20815

# How

- Update the intro sentence in `docs/pages/build/orbit.mdx`,
`docs/pages/develop/tools.mdx`, `docs/pages/review/with-orbit.mdx`,
`docs/pages/more/glossary-of-terms.mdx`, and
`docs/pages/tutorial/eas/introduction.mdx` to read "macOS, Windows, and
Linux" instead of "macOS and Windows".
- Update the bullet in `docs/pages/additional-resources/index.mdx` to
read "macOS menu bar, Windows task bar, or Linux system tray".
- Update the "Orbit relies on the Android SDK..." info callout in
`docs/pages/build/orbit.mdx` and `docs/pages/develop/tools.mdx` to
include Linux.
- - Add a new `<Tab label="Linux">` block to the `<Tabs>` install
section in both `docs/pages/build/orbit.mdx` and
`docs/pages/develop/tools.mdx`.
- Remove the "Orbit for Windows is in beta and is only compatible with
x64 and x86 machines" callout from the Windows tab in both pages, since
the Orbit README no longer marks Windows as beta.
- In `docs/pages/tutorial/eas/android-development-build.mdx`, change
"Open the Orbit menu bar app." to "Open the Orbit app." since Linux +
Android is a valid development combo and "menu bar app" is
macOS-specific phrasing. The two iOS-context tutorial pages keep the
"menu bar app" wording because iOS development requires macOS.

# Test Plan

Run the docs locally with `pnpm dev` and verify each updated page
renders correctly:

- `/build/orbit/`: install section shows three tabs (macOS, Windows,
Linux). Windows tab no longer has the beta callout. Linux tab points at
GitHub releases and mentions `.deb` and `.rpm`. Intro paragraph and
Android SDK callout both mention Linux.
- `/develop/tools/`: same three-tab install section and Linux mentions.
- `/review/with-orbit/`: intro sentence mentions all three platforms.
- `/more/glossary-of-terms/#expo-orbit`: glossary entry mentions all
three platforms.
- `/tutorial/eas/introduction/`: tools section mentions all three
platforms.
- `/additional-resources/`: `expo/orbit` bullet mentions Linux system
tray.
- `/tutorial/eas/android-development-build/`: step 87 reads "Open the
Orbit app." with no "menu bar" qualifier.


<img width="2398" height="658" alt="CleanShot 2026-04-27 at 23 28 03@2x"
src="https://github.com/user-attachments/assets/aee1dea7-2a12-4681-aeb7-089d107addb7"
/>


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

Fix ENG-20814

Follow-up @kadikraman's feedback from
#45075

# How

- Drop the `numberOfRequirements` prop from `<Prerequisites>`. The
component now derives the count from
`Children.toArray(children).filter(...)` so authors no longer hand-count
their own children.
- Drop the `number` prop from `<Requirement>` entirely.
`<Prerequisites>` now owns the numbered row frame (border, padding, the
`N.` prefix), and `<Requirement>` is a pure content component with `{
title, children }` only.
- Add `Prerequisites.test.tsx` with two cases: single-requirement
(asserts no inline `1.` and the singular "1 requirement" header counter)
and multi-requirement (asserts `1.`/`2.`/`3.` and the plural "3
requirements" counter).
- Strip `numberOfRequirements={N}` from 68 `<Prerequisites>` openings
across 56 `.mdx` pages.
- Strip `number={N}` from 154 `<Requirement>` openings, including the
multiline `<Requirement title={<>...</>}>` shapes.

# 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 test` and all tests should pass.

- See preview. Visually nothing has changed.

<img width="2560" height="2270" alt="CleanShot 2026-04-27 at 23 04
25@2x"
src="https://github.com/user-attachments/assets/60abb412-1976-4590-af2f-7bf8f9231d6d"
/>

<img width="2594" height="930" alt="CleanShot 2026-04-27 at 23 04 33@2x"
src="https://github.com/user-attachments/assets/450f3bf1-702b-478e-b1c7-73859f96e936"
/>

<img width="2586" height="1176" alt="CleanShot 2026-04-27 at 23 04
46@2x"
src="https://github.com/user-attachments/assets/c0c57810-f8a4-44f9-9529-b973f6776a7f"
/>

<img width="2450" height="1894" alt="CleanShot 2026-04-27 at 23 05
00@2x"
src="https://github.com/user-attachments/assets/abb1062a-d759-4fcd-83b6-5ad90ffeba3f"
/>

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

Co-authored-by: Łukasz Kosmaty <kosmatylukasz@gmail.com>
Co-authored-by: Aman Mittal <amandeepmittal@live.com>
# Why

#45008 was merged without essential
code which was lost during the rebase.

# How

Add the `dispatchInDebug` logic back

# Test Plan

1. CI
2. Manual testing

# 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

We need a way to disable the react-navigation check in metro plugin for
two reasons:
- in case of custom/weird setup, some users may want to disable the
check
- to fix bare-expo app

# How

1. Add check for `EXPO_ROUTER_DISABLE_RN_NAVIGATION_CHECK`
2. Add the `EXPO_ROUTER_DISABLE_RN_NAVIGATION_CHECK=1` to bare-expo
commands to fix the CI

# 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

Follow-up to #44337.

On iOS, the JSI-based `Record` conversion eagerly materialized whole JS
objects through `getAny()`, which could crash on extra JS-only
properties like `AbortSignal`. This PR also restores the pre-JSI
object-hydration behavior for `undefined` properties.

# How

- Reworked typed `Record` argument hydration to read only declared
`@Field`s from `JavaScriptObject` instead of materializing the whole
object through `getAny()`.
- Added direct JS emission for typed `Record` and `FormattedRecord`
returns so they no longer go through `toDictionary() ->
JavaScriptValue`.
- Restored the old object-conversion behavior for `undefined` values
during typed hydration, including nested dictionary values.

# Test Plan

- iOS unit tests
  - Added new regression tests
- `echoObject` benchmark: ~16% improvement
- `File.downloadFileAsync()` no longer crashes on `AbortSignal` being
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)
- [ ] 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.
-->

The `expo-docs.Consistency` Vale rule flagged the substring `nodejs`
inside link URLs like `https://nodejs.org/en`, producing six
false-positive errors that failed CI on otherwise correct pages:

<img width="1964" height="1320" alt="CleanShot 2026-04-28 at 16 12
21@2x"
src="https://github.com/user-attachments/assets/278f5c10-9cc1-4d2c-bd80-ac1cc6f5b87b"
/>


# How

- Add `nodejs.org, ` explicitly in `TokenIgnore` list.

# Test Plan

Run `pnpm run lint-prose` and confirm below:

<img width="1622" height="358" alt="CleanShot 2026-04-28 at 16 12 36@2x"
src="https://github.com/user-attachments/assets/ebccd6c7-ca10-412a-94fa-75d8a7934f2b"
/>


# 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

Expo modules could be linked as precompiled xcframeworks even when an
upstream Expo dependency, like ExpoModulesCore, was unavailable as
prebuilt or configured to build from source.

That produced inconsistent installs and build failures where downstream
modules used prebuilt artifacts while their parent dependency built from
source.

## How

Track Expo prebuilt dependency pods from spm.config.json and resolve
prebuilt availability recursively before linking a module as
precompiled.

When a parent dependency is unavailable or configured with
buildFromSource, keep the downstream module source-built too, and show
the concrete fallback reason in the precompiled summary.

Also: Exclude ExpoModulesJSI from this dependency check because it is
always provided through its own custom xcframework path rather than the
Expo precompiled tarball pipeline.

# Test Plan

Tested in reproduction project that had this failure. Created new expo
project and tried running `pod install` which failed. After this fix it
does no longer fail.

NOTE: This fixes part one of the above failure, next PR will fix the
resolving of the package.

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

Related to #44445, #44292, etc

This updates the `expo-router` codebase to comply with
`noUncheckedIndexedAccess` to align it back with the rest of the
monorepo.

To comply with type files too, since this is a really large package,
I've also updated the test files, by temporarily including them in the
checks. I've also fixed one issue related to `verbatimModuleSyntax` (in
`src/link/Link.tsx`) although this won't be turned on until
`expo-router` is converted to ESM.

> [!NOTE]
> The changes have largely been AI-written and manually edited and
reviewed

# Test Plan

- CI should pass unchanged

# 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

Fixes regression for monorepo from #45039

When we let `NODE_PATH` be included, which is what's being done here due
to the use of `Module._nodeModulePaths` then we can always resolve it
when it's installed with non-strict pnpm isolated installations due to
`NODE_PATH=node_modules/.pnpm/node_modules`

# How

- Replace `resolveFrom` with `@expo/require-utils` (mostly equivalent)
- Add `skipNodePath` option for `expo-router` presence check

# 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

Some Expo packages can be installed nested under another package, for
example:

`node_modules/expo/node_modules/expo-modules-core`

As a result, ExpoModulesCore built from source even though its
npm-bundled precompiled XCFramework was available.

# How

Use Expo autolinking's resolved module list as the source of truth for
internal Expo package locations instead of relying on node_modules
directory scanning. For each resolved Expo pod, derive the package's
spm.config.json from the autolinking-provided podspecDir. This preserves
nested package locations such as:

`node_modules/expo/node_modules/expo-modules-core`

and allows the precompiled resolver to find npm-bundled artifacts for
packages that are not installed at the top level.

Handle both podspecDir forms reported by autolinking: package roots and
ios subdirectories.

# Test plan

Created a local repro where expo-modules-core is installed at:

`node_modules/expo/node_modules/expo-modules-core`

Before the fix, a clean install with `EXPO_USE_PRECOMPILED_MODULES=1`
reported:

`ExpoModulesCore` (Build from source: framework not found no prebuilt
xcframework available)

After the fix, the same clean pod install reports:

📦 ExpoModulesCore (55.0.23)

and creates:

`ios/Pods/ExpoModulesCore/ExpoModulesCore.xcframework
`
# 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)

---------

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

The new `expo-file-system` module lacks upload support and pause/resume
for long-running transfers. This adds `UploadTask` and `DownloadTask`
classes as SharedObject-based replacements for the legacy
`createUploadTask()` and `createDownloadResumable()`.

# How

- Add `file.createUploadTask(url, options)` — supports binary and
multipart uploads with progress tracking, cancellation via
`task.cancel()` or `AbortSignal`
- Add `File.createDownloadTask(url, dest, options)` — supports
pause/resume via HTTP Range headers with silent fallback,
`DownloadPauseState` for persistence, and `DownloadTask.fromSavable()`
for restoring paused downloads
- JS-side state machine (`idle → active → completed/error/cancelled`,
plus `paused` for downloads) guards all method calls; native code is
stateless
- Native implementations: iOS uses `URLSession` with delegates; Android
uses OkHttp with coroutines
- Progress events throttled at 100ms on both platforms

# Test Plan

NCL (iOS and Android):
1. Create or select a file, tap "Upload binary" and "Upload multipart" —
verify progress updates and result JSON
2. Tap "Cancel upload (task.cancel)" and "Cancel upload (AbortSignal)"
during upload — verify cancellation
1. Tap "Start download" — verify progress and completion
2. During download, tap "Pause" → "Resume" — verify it continues from
where it left off
3. Pause → "Resume from savable" — verify restoration from persisted
state
4. Tap "Cancel" and "Abort (AbortSignal)" during download — verify
cancellation

# 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).
- [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 Apr 28, 2026
@pull pull Bot added the ⤵️ pull label Apr 28, 2026
@pull pull Bot merged commit db536bc into code:main Apr 28, 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.

8 participants