Conversation
…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)
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 : )