Skip to content

[pull] main from expo:main#604

Merged
pull[bot] merged 9 commits intocode:mainfrom
expo:main
Feb 18, 2026
Merged

[pull] main from expo:main#604
pull[bot] merged 9 commits intocode:mainfrom
expo:main

Conversation

@pull
Copy link

@pull pull bot commented Feb 18, 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 : )

kitten and others added 9 commits February 18, 2026 17:38
…p.config.{cts,mts,cjs,mjs}` (#43242)

# Why

When evaluating `.ts` (not `.mts` or `.cts` files) we should allow the
file to be written in "pure" CommonJS syntax. Previously, TypeScript
would force `export {}` to be added, preventing this, and hence causing
Node.js to not be able to auto-detect the file as CommonJS.

Additionally, for backwards-compatibility we should allow `.cts` files
so import and CJS syntax can still be mixed, as before.

# How

- Update options passed to TypeScript `transpileModule` for `.ts` files
to allow CommonJS syntax
- Discover dynamic app configs at `app.config.{ts,mts,cts,mjs,cjs,js}`

# Test Plan

- Rewrite an `app.config.ts` to only use `module.exports` and type-only
imports; this should work

# 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

During development and for both SSG and SSR exports, loaders are bundled
using the `isLoader: true` caller option, and are completely isolated
from the main/server bundle. However, SSR bundles still included
`loader` exports, as previously the SSG codepath still expected them to
be in the server bundle when exporting.

# How

Removed an early return in the loaders' Babel plugin that skipped loader
stripping for server bundles.

# Test Plan

- CI

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

# Why

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

Follow-up #43190

The `expo-image` library is already included in default tempalte which
is used for the Expo tutorial. The installatio instruction and context
about `npx expo install` should move to the next chapter.

# How

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

- Remove the `expo-image` install instruction, `<Terminal>` block, npx
expo install explanation, and the tip callout from Build a screen
chapter. Replace with a sentence noting that the library is already
included in the default template.
- Add the `npx expo install` explanation and the dev server tip callout
to Image Picker chapter, right after the install command.

# 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.
-->
<img width="2466" height="610" alt="CleanShot 2026-02-18 at 21 38 25@2x"
src="https://github.com/user-attachments/assets/3a0094c2-d0db-493e-99cc-e40199105034"
/>

<img width="2538" height="876" alt="CleanShot 2026-02-18 at 21 38 20@2x"
src="https://github.com/user-attachments/assets/07d845b6-cfc6-462b-9da4-10398f8ee39b"
/>


# 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).
- [x] 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.
-->

Fix ENG-19540

# How

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

- Add an info callout to the Quick Start section of 6 EAS
introduction/overview pages linking to the EAS CLI installation section:
build/introduction, submit/introduction, eas-update/introduction,
eas/metadata/index, eas/hosting/introduction,
eas/workflows/introduction.
- Revert `npx eas-cli@latest workflow:run` to `eas workflow:run` on the
EAS Workflows introduction page for consistency with the link-based
approach.
- Add `cmdCopy` prop to the multi-command `<Terminal>` on the EAS Update
introduction page so the copy button produces a runnable command.

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

Visit each of the 6 modified pages in local dev (`yarn run dev`) and
confirm the info callout renders correctly under the Quick Start heading
with a working link to /eas/cli/#installation.

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

Fix ENG-17363

As pointed out in the original task, the "Production errors" section in
the runtime issues page mixed two concerns: viewing native logs (a
general debugging technique) and handling production crashes (a specific
scenario). This made the native log instructions harder to find for
developers who weren't specifically debugging production issues.

The section also lacked actionable steps for production crashes, instead
of spreading relevant guidance (crash reporting dashboards, production
mode testing) across disconnected paragraphs. (A problem identified
while going through the doc myself, not part of the OG issue).

# How

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

- Extract native log instructions (`adb logcat` and Console app) into a
new "Viewing native logs" section placed before so they're discoverable
as a general debugging tool, not just a production crash technique.
- Rewrite "Production app is crashing" as a concise checklist of
actionable steps: check platform crash reports, use native log tools
(linking back to the new section), try production mode locally, and
check crash reporting dashboards (Sentry, BugSnag).
- Add an info callout near the top of the page linking to [Debugging
tools](/debugging/tools/) for readers already familiar with React Native
debugging.
- Minor copy improvements: clarify video title ("ADB Logcat" instead of
just "Logcat"), fix "macOS" casing, improve alt text for the Console
screenshot.

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

Visit the preview link,
https://pr-43208.expo-docs.pages.dev/debugging/runtime-issues/, and
manually verify:
- The new "Viewing native logs" section renders correctly with the video
embed, Terminal component, and Step components.
- The "Production errors" section flows logically and links to the
native logs section via the anchor `#viewing-native-logs`.
- All existing links (Google Play Console, Crashes Organizer, Apple
docs, Sentry, BugSnag, WebADB) resolve correctly.

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

---------

Co-authored-by: Kadi Kraman <kadi@expo.io>
# Why

Based on / Supersedes #42249

We should be able to log JSONL events and capture them for debugging. In
theory, most places that receive/send events, or that have `debug` calls
that are ultimately useful to be surfaced in non-terminal environments
or when more output is needed should have event calls.

In the future, we may be able to add the `profiler` system to this as
well, and be able to fork performance-relevant data (e.g. performance
marks and profiler outputs) out of the event system.

As a proof of concept, this ports the `MetroTerminalReporter` events to
the new system (with new requirements applied)

# How

**Base Requirements:**
- should be able to write to file descriptors (compatible with both unix
sockets and files/streams), and to file paths
- shouldn't slow down the runtime of the CLI by much more than the cost
to stringify JSONL events
- should be able to define types ahead of time and collect them in one
place

Most events we want to capture can be captured rapidly (we shouldn't
care too much about how many events we log), and we should keep
pre-processing to a minimum to allow the event system to always be
active without much overhead.

The stream that we're writing with is similar to `FastUtf8Stream` /
`SonicBoom` and is non-blocking. Flushing is avoided to keep performance
high.

- Implement non-blocking `LogStream`
- Add `installEventLogger` to entrypoint
  - protects stdout/stderr when logger is active on one of them)
- Add `events('category')` helper to create structured log events
- Add logger to `MetroTerminalReporter` to demonstrate usage
- Clean up calls in `MetroTerminalReporter` and pass sanitized data to
event logger
- Add `shouldReduceLogs` helper and disable bundling progress when
headless is active and event logger is used
- **Drive-by fix:** Rename `projectRoot` variable in
`MetroTerminalReporter` to `serverRoot` to reflect its actual path

# Test Plan

Verify that metro events are logged:
- Run `LOG_EVENTS=events.log expo start` and check `events.log`
- Run `LOG_EVENTS=1 expo start` and check standard output

# 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

closes #38223

The above issue didn't include full repro steps so here they are:

### Prerequisites

- An Expo app with `expo-notifications` and `expo-task-manager`
configured
- A registered `BACKGROUND_NOTIFICATION_TASK` via
`TaskManager.defineTask` and `Notifications.registerTaskAsync`

### Sending push notifications

Install `expo-server-sdk`:

```bash
mkdir /tmp/expo-push-test && cd /tmp/expo-push-test
npm init -y && npm install expo-server-sdk
```

Create `send.mjs`:

```js
import { Expo } from "expo-server-sdk";

const expo = new Expo();
const token = "ExponentPushToken[YOUR_TOKEN_HERE]";
const mode = process.argv[2] // data (headless) or regular notification

const message = mode === "data"
  ? { to: token, data: { type: "background_task", timestamp: String(Date.now()) }, _contentAvailable: true }
  : { to: token, title: "Test", body: `Notification at ${new Date().toLocaleTimeString()}` };

const [chunk] = expo.chunkPushNotifications([message]);
console.log(`Sending ${mode} notification...`);
const result = await expo.sendPushNotificationsAsync(chunk);
console.log("Result:", JSON.stringify(result, null, 2));
```

### Reproduction steps

1. **Launch the app** and confirm it's in the foreground
2. **Send a display notification:**
3. **Kill the app** (swipe away from recents)
4. **Tap the notification** from the system tray — the app opens
5. **Wait for the app to fully load**
6. **Send a data-only notification:**

### Expected behavior

The `BACKGROUND_NOTIFICATION_TASK` executes and JS receives the
notification.

### Actual behavior (before fix)

The background task silently fails. All subsequent data-only
notifications also fail — the task never runs again until the app is
force-stopped and restarted.

### Root cause

When tapping the notification in step 4, `handleNotificationResponse`
called `runTaskManagerTasks` while the app was still launching. This
started a headless React instance that raced with the foreground app.
The foreground `TaskManager` got misclassified as headless (via
`isStartedByHeadlessLoader`), then wiped by `invalidateAppRecord` —
permanently breaking background task execution for the session.

# How

Only call `runTaskManagerTasks` for non-default notification actions
(custom action buttons like "Mark as read").

The default tap (`DEFAULT_ACTION_IDENTIFIER`) always opens the app, so
there's no need for headless task execution — the foreground app handles
the response via listeners.



The fix is in `if (!isAppInForeground() &&
notificationResponse.actionIdentifier !=
NotificationResponse.DEFAULT_ACTION_IDENTIFIER)` but I also resolved one
older TODO around an awkward use of `WeakHashMap`.

# Test Plan

- tested on device using the repro steps

# 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)
@pull pull bot locked and limited conversation to collaborators Feb 18, 2026
@pull pull bot added the ⤵️ pull label Feb 18, 2026
@pull pull bot merged commit 0e16952 into code:main Feb 18, 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.

5 participants

Comments