Skip to content

[pull] main from expo:main#955

Merged
pull[bot] merged 15 commits into
code:mainfrom
expo:main
Jun 11, 2026
Merged

[pull] main from expo:main#955
pull[bot] merged 15 commits into
code:mainfrom
expo:main

Conversation

@pull

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

intergalacticspacehighway and others added 15 commits June 11, 2026 10:24
…troyed state (#46785)

## Why

Closing a `@expo/ui` bottom sheet (or unmounting any `Host`
`matchContents` view mid-resize) crashes on Android with a native
`NullPointerException`:

```
java.lang.NullPointerException
  expo.modules.kotlin.jni.fabric.NativeStatePropsGetter.updateViewSizeImmediate(Native Method)
  expo.modules.kotlin.views.ShadowNodeProxy.setViewSize$lambda$0(ShadowNodeProxy.kt:20)
  expo.modules.kotlin.views.ShadowNodeProxy$scheduleFlush$listener$1.onPreDraw(ShadowNodeProxy.kt:46)
```

## How

The synchronous shadow node size update is deferred to an `onPreDraw`
listener. If the view is unmounted before that listener fires, the
Fabric `StateWrapper`'s native state has already been destroyed
(`destroyState()` -> `resetNative()`), so calling into it throws from
native.

The fix mirrors what React Native does for its own native state
accesses: skip the flush when the wrapper's native side is gone.
`ExpoView.stateWrapper` is always RN's `StateWrapperImpl`, which is a
fbjni `HybridData`, so we check `HybridData.isValid`.

## Test Plan

Open a bottom sheet with `matchContents` content on Android and close it
during the resize/close animation.

- Before: crashes with the NPE above.
- After: closes cleanly.

## Checklist

- [x] Added a `CHANGELOG.md` entry
…tions in Guides (#46346)

# Why

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

Follow-up #46338

# How

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

Under Guides, update Assorted, Integrations, Expo Modules, and Push
notification sections Terminal references to include npm, yarn, pnpm,
and bun variants where Expo docs conventions call for
multi-package-manager commands.

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

See preview.

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

Follow-up #46655

# How

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

- Converted ~90 PNG screenshots to WebP across EAS Observe, Android
Studio setup, multiple guides, Expo Router, Expo tutorial, and several
smaller sections (about 14.7 MB down to ~4 MB).
- Update Android Studio and Android Emulator instructions and
screenshots.

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

See preview.

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

# Why

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

Fix ENG-21051

# How

- Adds an AI agents overview plus per-agent quick-start guides for
Claude Code, Codex, and Cursor under `pages/agents/`, registered in the
Home > AI section in `navigation.js`.
- Also migrates the Expo MCP Server page from `/eas/ai/mcp` to `/mcp`,
adding redirects in `_redirects` and `client-redirects.ts` and
re-pointing the links in `skills.mdx` and `glossary-of-terms.mdx`.
- Update page title for `/llms`.

# Test Plan

See preview for:
- https://pr-46704.expo-docs.pages.dev/agents/
- https://pr-46704.expo-docs.pages.dev/agents/claude/
- https://pr-46704.expo-docs.pages.dev/agents/codex/
- https://pr-46704.expo-docs.pages.dev/agents/cursor/

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

# Why

Events declared in a module were not emitted in TypeScript.

# How

Now creating a type `ModuleNameEvents` which contains all event
declarations. Generated module class is now parametrized by this type
(`extends NativeModule<ModuleNameEvents>`).

# Test Plan
- [x] added events to the `TestModule.swift`
- [x] tested `local-test`, updated snapshots
- [x] checked commands manually

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

# Why

The expo-video `player-output` e2e test is flaky on iOS. After a player
is swapped to a different `VideoView`, that view stays blank for a frame
or two while it repaints. The flow sometimes screenshots during that
gap, so the viewshot comparison fails even though nothing is broken.

# How

Added a per-view "frame painted" gate in
`VideoChangePlayerOutputScreen`. On iOS, a view that receives a player
is marked not-ready on swap and flipped back from its
`onFirstFrameRender` callback. Once every visible view has painted, the
screen renders a `viewshot-ready` testID. State starts optimistic (all
ready) so other platforms never gate.

The maestro flow now waits for `viewshot-ready` before each
`viewshot-comparison`, so screenshots only happen after the swapped
views have actually rendered.

# Test Plan

Ran the `player-output` e2e flow on iOS several times: it waits for
`viewshot-ready` at each step and the viewshot comparisons pass
consistently instead of intermittently failing.

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

# Screenshot

<img width="599" height="608"
src="https://github.com/user-attachments/assets/e6527412-970d-4b10-8c5f-76faa636b3ca"
/>
…ws (#46763)

# Why

Two scheduled CI workflows were failing (and also fail on Dependabot PRs
that touch their workflow files):

- **Test React Native nightly build**: Android JS bundling failed
because RN nightly's `EventEmitter.js` uses newer Flow syntax
(`readonly` property modifiers) that `hermes-parser@0.33.3` can't parse.
- **Publish Canaries**: the dry run failed with `You must be logged in
to NPM to publish packages`
(https://github.com/expo/expo/actions/runs/27276517920/job/80559164326).

# How

Two separate root causes.

**`create-expo-nightly` was never testing the local repo.** Since the
pnpm migration (#44057) it relied on the package.json `workspaces` field
plus `preferWorkspacePackages`, but pnpm ignores `workspaces` (it wants
a `pnpm-workspace.yaml`), and `preferWorkspacePackages` won't link a
workspace package whose version doesn't satisfy the requested range. The
canary template pins different versions than the repo, so the build
silently used the published canary packages.

That is also why bumping `hermes-parser` in the repo (#46636) had no
effect: the canary `@expo/metro-config` was doing the bundling. Fixed by
rewriting the project's expo dependencies to `workspace:*` and writing a
real `pnpm-workspace.yaml`, so the local `@expo/metro-config` (already
on `hermes-parser@^0.36.0`) is used.

**The canary dry run shouldn't require NPM auth.**
`checkEnvironmentTask` always ran `npm whoami`, but Dependabot runs and
forks have no repository secrets, so the token is empty and it throws. A
`--dry` run never publishes (downstream side effects are already gated
on `!options.dry`), so it now returns early when `options.dry` is set.
The real publish path (manual `workflow_dispatch`, no `--dry`) still
requires login.

# Test Plan

- `tsc` and `eslint` pass for both `create-expo-nightly` and `tools`.
- Confirmed `hermes-parser@0.33.3` fails on `readonly context: unknown;`
with the exact CI error while `0.35`/`0.36` parse it.
- Reproduced the pnpm linking in a minimal workspace: `workspace:*`
links the local package even on a version mismatch, and its transitive
`workspace:*` deps resolve to local too; `preferWorkspacePackages` alone
does not.
- Both workflows trigger on changes to their own files, so they validate
the fixes on this PR.

# 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).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why
Closes: https://expo.canny.io/feature-requests/p/expo-media-library-queryexe-should-support-returning-populated-asset-data-bulk-f
Introduced `Query.exeForMetadata()`, which returns an array of `AssetMetadata` instead of `Asset`. This change improves the performance of bulk fetches.
# How
* Android:
    * Renamed `MediaStoreToAssetAdapter` to `AssetMapper` and moved it to the module level. This is because both the `Query` and `Asset` classes  rely on it.
    * Created separate domain classes for different types of assets: `MediaStoreImageAsset`,`MediaStoreVideoAsset`, and `MediaStoreAudioAsset`. We used to have a single interface for all of these, which caused problems when handling type-specific fields like duration (e.g., ```kotlin fun Cursor.buildAssetMediaStoreItem(includeDuration: Boolean): AssetMediaStoreItem```).
    * Replaced the entire `AssetMediaStoreItemBuilder` with a simple cursor extension. The previous class was too complex. Since we fetch either a single property or all of them, we don’t need to handle specific combinations of fields.
* iOS:
    * Added `AssetMapper` and a new function to `Query`.
# Test Plan
* Added new tests to the test suite ✅
* Tested on BareExpo (Android API 28, 36 and iOS 26.2)  ✅
# Why

Mirror #46765
According to
[ECMAScript](https://tc39.es/ecma262/multipage/control-abstraction-objects.html#sec-promise-objects),
repeated attempts to resolve or reject an already-settled promise should
be ignored without error/warning.

# How

Remove exception/warning on repeated attempts to settle a promise. 

# 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

Expose SwiftUI’s `activityBackgroundTint(_:)` modifier for Live Activity
layouts.

# How

Added modifier to widgets file.

# Test Plan

<img width="357" height="179" alt="image"
src="https://github.com/user-attachments/assets/9f849c75-b346-43ff-8452-671b7dae5d65"
/>

```tsx
// ...
return {
  banner: (
    <HStack
      spacing={12}
      modifiers={[padding({ all: 14 }), activityBackgroundTint(PlatformColor('systemBlue'))]}>
// ...
```

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

<img width="1399" height="164"
src="https://github.com/user-attachments/assets/2d4386a9-e3e0-406e-b54e-256f1d0dcc21"
/>

# How

Bump `setup-java` action to v5

# Test Plan

Wait for the CI to pass

# 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 Jun 11, 2026
@pull pull Bot added the ⤵️ pull label Jun 11, 2026
@pull pull Bot merged commit a9e782d into code:main Jun 11, 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