Skip to content

[pull] main from expo:main - #1191

Merged
pull[bot] merged 6 commits into
code:mainfrom
expo:main
Aug 27, 2026
Merged

[pull] main from expo:main#1191
pull[bot] merged 6 commits into
code:mainfrom
expo:main

Conversation

@pull

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

amandeepmittal and others added 6 commits August 27, 2026 21:36
…49443)

# Why

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

Fix ENG-26228 ENG-26235

# How

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

Add /api and /developers redirects for agent discovery paths.

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

`pnpm test:worker` should 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)
# Why

In preparation for React Native 0.87.0, we should bump our repo to use
the latest react-native RC.

This does not bump Expo Go, that is done in another PR in this stack ->
#48771

# How

- update package versions
  - `react-native  0.86.0-> 0.87.0-rc.4`  
  - `@react-native/normalize-colors 0.86.0 ->  0.87.0-rc.4` 
  - `@react-native/babel-preset 0.86.0 ->  0.87.0-rc.4` 
  - `@react-native/dev-middleware 0.86.0->  0.87.0-rc.4`    
- Update Expo router TS and drop InteractionManager usage 

# Test Plan

bare-expo ios / android
minimal-tester ios / android

# 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: expo-tuft[bot] <288127324+expo-tuft[bot]@users.noreply.github.com>
Co-authored-by: gabrieldonadel <11707729+gabrieldonadel@users.noreply.github.com>
# Why

Part of the React Native 0.87 upgrade stack: #48769 (version bumps) →
this PR (library fixes) → #48771 (Expo Go).

# How

- Fix Asset registry migration and JS/TS fixes: Metro's
`assetRegistryPath`, expo-asset, expo-image, expo-video, jest-expo, and
the TS declarations now point at `react-native/asset-registry`, so
Metro-registered assets and React Native's own `<Image>` share one
registry instance on native. Web keeps the virtual registry, and imports
of the removed package are redirected for backwards compatibility. Also
fixes `expo-ui` Host color scheme types against the stricter 0.87 API,
supports 0.87's native `backgroundImage` style in html-elements, and
removes an import of the deleted `RCTRootContentView.h`.

- Bump gradle plugins to Kotlin 2.2.21: explicitly enables
`buildFeatures.buildConfig` where required, fixes the brownfield
fused-mode template for the new `minSdk` DSL, declares the fused-mode
AGP version as a minimum constraint instead of forcing it, and keeps
Room's generated database constructor under R8.

- Third-party library patches: 
- `@shopify/react-native-skia` (uses iOS bridge APIs removed upstream),
- `react-native-screens` (retargeted at 4.26.0 with its 0.87 iOS fixes),
- `react-native-safe-area-context` (retargeted at 5.7.0 with its Kotlin
fix),
- `react-native-reanimated`/`react-native-worklets` (declare 0.87 in
`compatibility.json`, and configure the Kotlin `jvmTarget` reflectively
so their Gradle scripts compile on any host classpath).


# Test Plan

- CI on this PR: package unit tests (`et check-packages`), the Android
and iOS build workflows, brownfield testers, and the updates E2E suite.
- Locally: clean iOS builds of `apps/minimal-tester` (including
`use_frameworks! :linkage => :static`) and `apps/bare-expo` against 0.87
with the precompiled React-Core. bare-expo currently stops at a known
`react-native-skia` 2.6.2 incompatibility with 0.87 that is tracked
separately and not introduced by this PR.
- The Expo Go Android and iOS builds in #48771 run on top of this
branch.
# Why

`expo-modules-autolinking` is not a direct dependency of `expo-widgets`,
but it is to `expo`. In some setups it may cause issues.

# How

Resolve `expo-modules-autolinking` relative to `expo` like we do in
other packages/template.

# Test Plan

`expo-widgets` should link properly.

# 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).
… platforms (#49444)

# Why

Part of the React Native 0.87 upgrade stack, split out of #48770 per
review feedback
(#48770 (comment)).

The Expo CLI resolver intercepts imports of
`@react-native/assets-registry/registry` and serves a small virtual
registry module. Before 0.87 this worked on every platform because React
Native's own code imported the same standalone package, so the intercept
caught both sides and Metro-registered assets and React Native's
`<Image>` shared one registry instance.

React Native 0.87 removed the standalone `@react-native/assets-registry`
package. React Native core now bundles its own registry and imports it
internally, where the resolver intercept cannot see it. With the
always-virtual behavior, native builds end up with two registry
instances: Metro's asset modules register into the virtual registry
while `<Image>` reads React Native's internal one, so assets fail to
resolve at runtime.

# How

- Resolve both `react-native/asset-registry` (the new 0.87 subpath) and
the legacy `@react-native/assets-registry/registry` specifier through
one intercept.
- On native platforms, resolve to `react-native/asset-registry` so
Metro's asset modules and React Native core share the single registry
instance inside `react-native`.
- On web, keep serving the virtual registry module, since `react-native`
is not bundled there.

# Test Plan

- Added resolver unit tests covering both module specifiers: native
resolves to `react-native/asset-registry`, web resolves to the virtual
`\0polyfill:assets-registry` module.
- Exercised end to end by the rest of the 0.87 stack: Expo Go and
bare-expo builds on the branches above load Metro-registered assets
through React Native's `<Image>` on device.
# Why

Part 3 of the React Native 0.87 upgrade for SDK 58 PRs. This part moves
Expo Go itself to React Native 0.87: the react-native-lab fork, the
Android build system (AGP 9, Gradle 9.4), and the client version bump.


# How

- Pointed `react-native-lab` at the sdk-58 fork built on react-native
0.87.0 and regenerated the Expo Go lockfiles and Podfile.lock. Aligned
Expo Go, eas-expo-go, and the fork pointer, and bumped Expo Go to
0.87.0.
- Moved Expo Go Android to AGP 9 and Gradle 9.4 with both template
opt-outs in `gradle.properties`. `android.newDsl=false` is also required
because EAS Build injects a script that reads
`android.applicationVariants`, which the new DSL removes. `:app` and
`:expoview` apply the Kotlin Gradle plugin explicitly again.
- Expo Go builds React Native from source, and upstream only ever builds
ReactAndroid and popup-menu-android with built-in Kotlin. AGP ignores a
per-project `android.builtInKotlin=true` override, so the fork applies
the Kotlin Gradle plugin explicitly in both build scripts.
`BaseViewManager.java` inlines the `ViewProps.*` strings in its
`@ReactProp` annotations because K2 under plain KGP crashes on Java
annotations that reference Kotlin `const val`s from the same module.
- Pinned Kotlin to 2.3.0, the exact compiler AGP 9.2's built-in Kotlin
embeds, so the same sources keep compiling with the same compiler.
Replaced DBFlow with Room + KSP in expoview (kapt has no future under
AGP 9 and DBFlow has no KSP processor). The legacy databases are caches,
so Room's destructive fallback recreates them. Room 2.8 is required for
KSP2.
- Adapted expoview sources to the 0.87 API: `ReactNativeHost` is now a
Kotlin class, so synthetic property access on its getters no longer
resolves; `AppTask.taskInfo` is now nullable; the Room entity's
`is`-prefixed nullable Booleans are not supported by KSP2. Migrated
`:app` off AGP 8-only APIs (`applicationVariants`, the legacy
`LibraryExtension` lookup) so it works under both DSLs.
- Kept only the functional 0.87 fixes in the library patches
(keyboard-controller Kotlin fix, reanimated/worklets podspec and
compatibility ranges, safe-area legacy-architecture relayout removal)
and updated the Expo Go proguard file.

# Test Plan

- `./gradlew :app:compileMobileDebugKotlin` and
`:app:compileMobileDebugJavaWithJavac` in `apps/expo-go/android` pass.
This compiles ReactAndroid and popup-menu-android from the fork,
expoview (Room/KSP, Compose, kotlinx-serialization), all expo modules,
and every now-unpatched third-party library under both opt-outs.
- `grep -r builtInKotlin patches/` returns nothing; no library carries
build-mode guards anymore.
- CI runs the full Expo Go Android and iOS client builds, including the
release variants not exercised locally.
@pull pull Bot locked and limited conversation to collaborators Aug 27, 2026
@pull pull Bot added the ⤵️ pull label Aug 27, 2026
@pull
pull Bot merged commit 3321ac2 into code:main Aug 27, 2026
39 of 41 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.

3 participants