Skip to content

[pull] main from expo:main#842

Merged
pull[bot] merged 24 commits intocode:mainfrom
expo:main
May 7, 2026
Merged

[pull] main from expo:main#842
pull[bot] merged 24 commits intocode:mainfrom
expo:main

Conversation

@pull
Copy link
Copy Markdown

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

chrfalch and others added 24 commits May 7, 2026 12:58
# Why

When building our precompiled XCFrameworks we get a lot of log output -
a lot of it is not necessary.

# How

This PR fixes it by moving most of the trivial log output to a verbose
option.

This reduces the output when build from around 30.000 to 3000 lines
with/without verbose.

# Test-plan

✅ Ran both with/without `--verbose` option to verify that it still
precompiles and displays warnings correctly.
# Why

When building 3rd party XCFrameworks, Skia failed locally when built
without cleaning:

```
❌ cpp/api/CustomBlendModes.h:10:15
  > 10 | constexpr int kBlendModePlusDarker = 1001;
       |               ^ redefinition of 'kBlendModePlusDarker'
     ... redefinition of 'kBlendModePlusLighter', 'kPlusDarkerSkSL',
         'kPlusLighterSkSL', 'CustomBlenders', 'applyBlendMode'
  ❌ Build Swift package failed: xcodebuild failed with code 65
```

This was caused by a stale hardlink after pnpm reinstall.

# How

SPMGenerator.ts flattens all package headers into a staging dir using
hardlinks, specifically so #pragma once works across include paths
(clang dedupes by inode). The skip condition for the relink, however,
was hasFileContentChanged(...) — content/size/mtime, not inode.

When pnpm reinstalled Skia (different patch hash → different
content-addressed .pnpm/ dir → fresh inode for CustomBlendModes.h,
identical bytes), the staged hardlink kept its old inode. Within a
single TU, clang then saw the header via two different inodes (staged
vs. -I source path) and processed it twice → redefinition errors for
every symbol in it.

Confirmed empirically:
source (May 6 20:30): inode 1761296556
staged (Apr 21 14:08): inode 1738862996

Fix: new exported helper refreshHardlinkIfNeeded(src, dest) that keys on
ino + dev and unlinks/relinks when stale. Replaces the inline
content-comparison block. Test in SPMGenerator.hardlinkRefresh.test.ts
simulates the same-content-new-inode case.

When running `et prebuild @shopify/react-native-skia` a small bug after
fix to ExpoWidgets build (#45461) the `@` prefix fell through. A
fix/test for this was also added by making `pathToLocalPackageJson` keep
the `require.resolve` test so that 3rd party projects use the old
path.join logic.

# Test-plan

✅ Run `et prebuild @shopify/react-native-skia` and verify that it works
without failure.
# Why

- add support for formatting failed script execution in xcodebuild.

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

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

---------

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

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

# 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

Unless I'm missing something, this was probably accidental from the pnpm
migration.

# 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

Bun is already defaulting to the isolated install, and since we support
this well now (and have for a while), and are using pnpm ourselves now,
we should drop this for newly created projects.

# How

- Drop setting `node-linker=hoisted` when creating projects with pnpm

**Note:** I didn't mark this as a feature or breaking. It feels natural
to just put it in "Others", since it's for new projects (so technically
not breaking), and isn't a feature but a removal.

# Test Plan

- Manually tested

# 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

This has been obsolete for a while, and there seems to be no need to
check for this anymore.

# How

- Drop `EXPO_USE_EXOTIC` flag

# Test Plan

- n/a

# 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 shouldn't have to check for `@expo/dom-webview` anymore, since it's
automatically installed (and hence linked) via `expo`. We have
`react-native-webview` as a fallback, but no check is technically
required here anymore.

We might want to tweak the dependency structure, but, as it stands, the
resolution here isn't correct for isolated dependencies, and likely
always failed. Just dropping the check since we know that _a_ webview
(`@expo/dom-webview`) will be installed is fine though. At worst, we're
moving an error for edge case setups into the runtime.

# How

- Drop webview installation check

# Test Plan

**Note:** Admittedly haven't tested this manually, but I have seen this
fail when `react-native-webview` isn't installed in isolated
installations, which is caused by the invalid 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

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

# 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

Adds an option to request only write permissions, requested in this
issue: #33002

# How

- Added a `writeOnlyAccess` prop to the config plugin
- Added `CalendarWriteOnlyNextPermissionsRequester` and added other,
corresponding requesters to the next package
- Renamed: ExpoCalendarPermissions to `CalendarAccessGuard`, and added
`CalendarPermissionRequester` to move the responsibilities from the
module class.
- Removed throwing RCTFatal in the legacy module when FullAccess
permissions are not defined in the infoPlist

# Test Plan
- Added a new test screen to NCL
- Tested the config plugin using: 
`et gba --useLocalTemplate -n test-app expo-calendar` 
with this screen:
[calendar.tsx](https://github.com/user-attachments/files/27474671/calendar.tsx)

Results: 
`writeOnlyAccess`: `true`:



https://github.com/user-attachments/assets/09c6bada-fa29-4fd9-a600-93f4b76ffcc2

`writeOnlyAccess`: `false`:



https://github.com/user-attachments/assets/aaff4658-6c3b-4aa8-a6b1-2525046fb5a9
# Why

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

Fix ENG-21084

The Algolia crawler fails to index `https://docs.expo.dev/eas/cli/` with
`Extractors returned too many records` (784 records, max 750). The page
renders 114 commands, each with up to five `<H4>` subsection labels,
which together exceed the per-URL record ceiling.

Similar in spirit to #41905, where redundant heading-equivalent elements
were trimmed from the App Config schema.

# How

In `EASCLIReference/index.tsx`, the `Usage`, `Argument(s)`, `Flag(s)`,
`Alias(es)`, and `Examples` labels inside `CommandSection` are now
rendered through a small `SubsectionLabel` component that emits a styled
`<p>` instead of `<H4>`.

Visual styling matches the previous heading (semibold, base size, tight
tracking), but the elements no longer produce heading records, removing
roughly 570 records and putting the page comfortably under the limit.
The `<H3>` per command is preserved, so command anchors and Algolia
sub-section grouping are unchanged.

# Test Plan

Run the docs locally and confirm `/eas/cli/` looks identical, that each
command still has a working `#command-slug` anchor, and that the
right-rail TOC continues to list commands.

After deploy, I'll re-crawl the page in the Algolia dashboard and verify
the URL inspector reports a successful index with records under 750.

# Checklist

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/nicknisi/dotfiles/wiki/Pull-Request-Guidelines).
- [ ] 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 should slowly add macOS support to more libraries, and we plan on
using expo-linear-gradient in Expo Orbit

# How

Add macOS support to linear-gradient, most of the code was already
compatible

# Test Plan

Run BareExpo macos locally 

<img width="1522" height="1664" alt="image"
src="https://github.com/user-attachments/assets/ef5e604c-105f-4faf-a330-82fa97c6467e"
/>


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

- Drop "other" from message if there's no `expo` update
- Wrap result in a ref to have access to raw result early
- Don't await result in non-interactive mode
- Place result message below commands table and adjust rows fitment

# Test Plan

- Tested manually in `apps/router-e2e`

# 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

As Alan pointed out on #45443, `et
bump-rn` command is bumping the react-native dependencies inside expo-go
vendored modules

# How

Fix `et bump-rn` command to not bump vendored modules and also update
the root package.json resolutions field

# Test Plan

run `et bump-rn -v 0.85.3`

# 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

Move Expo UI in a separate subsection similar to Expo Router

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

# How

Using `makeSection` util. I have placed it below Expo Router and above
Expo SDK as Expo SDK is a big section and requires some scrolling, lmk
if this ordering works.

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

# Test Plan

  <table>         
    <tr>
      <td><b>Before</b><br><img width="200" 

src="https://github.com/user-attachments/assets/0d1c3add-9ab0-48bc-8a67-4996a81ebacf"
/></td>
      <td><b>After</b><br><img width="200" 

src="https://github.com/user-attachments/assets/6b7cd68e-1647-40a9-8e46-2a1bdf8fc288"
/></td>
    </tr>         
  </table>      

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

---------

Co-authored-by: Kudo Chien <kudo@expo.dev>
# Why

We need hero image depicting component. This PR adds images for SwiftUI
components. Jetpack compose
[PR](#45476)
 
<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

The screenshots are auto generated by rendering Expo UI components in
NCL app using this skill -
https://gist.github.com/intergalacticspacehighway/7d8b7bb410db0bbd7a00554e6967ec15

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

# Test Plan

Run the docs locally, verify images in SwiftUI component docs. Test
dark/light mode images.


https://github.com/user-attachments/assets/6b2b06be-fc83-4ff4-b0d2-4001442a948b


<!--
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

Adds `MaskView` implementation on Android, which will be available via the `/community` export in upstack PR

# How

- New `MaskView` Compose view (`expo-ui/android/.../MaskView.kt`) 

# Test Plan

upstack PR

# 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 a drop-in replacement for [`@react-native-masked-view/masked-view`](https://github.com/callstack/masked-view) under `@expo/ui/community/masked-view`.
# How

- New `@expo/ui/community/masked-view` module exposing `MaskedView` with the upstream API (`maskElement: ReactElement` + arbitrary RN children + `ViewProps`). Each platform bridges RN children into the native masking primitive via `RNHostView`:
  - **Android**: Jetpack Compose graphics layer compositing with `BlendMode.DstIn`. Backed by an internal `MaskView` (formerly the public `@expo/ui/jetpack-compose/Mask` primitive — demoted to internal).
  - **iOS**: SwiftUI [`.mask(alignment:_:)`](https://developer.apple.com/documentation/swiftui/view/mask(alignment:_:)) via the existing public SwiftUI `Mask` primitive.
  - **Web**: no-op fallback — renders `children` unmasked with a one-time `console.warn` - the web implementation in the original community package doesn't look appealing.

# Test Plan

1. Open NCL → UI → **Community MaskedView replacement** on Android and iOS. Verify each section renders correctly.

# 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

docs for the downstack PRs 
# 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)
@pull pull Bot locked and limited conversation to collaborators May 7, 2026
@pull pull Bot added the ⤵️ pull label May 7, 2026
@pull pull Bot merged commit 885d71a into code:main May 7, 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.