Conversation
# 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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 : )