Skip to content

[pull] main from expo:main#757

Merged
pull[bot] merged 7 commits intocode:mainfrom
expo:main
Apr 8, 2026
Merged

[pull] main from expo:main#757
pull[bot] merged 7 commits intocode:mainfrom
expo:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull bot commented Apr 8, 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 : )

alanjhughes and others added 7 commits April 8, 2026 17:05
…g `Module._nodeModulePaths` (#44599)

# Why

Related to / triggered by #44109

When a non-realpath is passed to `evalModule` / `compileModule` the
`node_modules` resolution wouldn't succeed since the
`Module._nodeModulePaths` are built against an incorrect/unresolved
path.

# How

- Resolve realpath of target files before using dirname for
`Module._nodeModulePaths`
- Resolve realpath of dirname when target file doesn't exist (mock
filenames)

# Test Plan

- CI should pass unchanged
- Can be reproduced by applying a pnpm patch to `expo` itself

**Reproduction steps of the original issue:**
- Create a temporary folder e.g. at `mktemp`
- Run `pnpm init && pnpm add expo @expo/require-utils`
- In a Node REPL, load `const { evalModule } =
require('@expo/require-utils')`
- Declare: `const configPath = path.join(process.cwd(),
'node_modules/expo/react-native.config.js');`
- Then: `evalModule('module.exports =
require("expo-modules-autolinking/exports")', configPath)` will fail,
since it points at incorrect/unresolved `node_modules` paths
- But: `evalModule('module.exports =
require("expo-modules-autolinking/exports")',
fs.realpathSync(configPath))` will succeed

# 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

On the new architecture (bridgeless), `EXDevLauncherController.isAppRunning` always returned `false` because it relied on the removed `RCTBridge` (`_appBridge` was always nil). This caused the dev launcher to swallow deep link URLs instead of letting them through to `RCTLinkingManager`, so warm deep links never reached JS.

# How

- Removed the `appBridge` (`RCTBridge`) property and all its usages from `EXDevLauncherController`.
- `isAppRunning` now delegates to `self.delegate.isReactInstanceValid()`.
- `EXDevLauncherUncaughtExceptionHandler.getWebSocketUrl` now uses `controller.sourceUrl()` instead of `appBridge.bundleURL`

# Test Plan

1. Build bare-expo with dev client on iOS.
2. With the app running, execute `xcrun simctl openurl booted "bareexpo://components/video/fullscreen"`.
3. Verify the app navigates to the Video Fullscreen screen.
4. Verify cold-start deep links still work: kill the app, then run the same `openurl` command.

# 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)
@pull pull bot locked and limited conversation to collaborators Apr 8, 2026
@pull pull bot added the ⤵️ pull label Apr 8, 2026
@pull pull bot merged commit 096f4cb into code:main Apr 8, 2026
19 of 21 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.

7 participants