Skip to content

[pull] main from expo:main#624

Merged
pull[bot] merged 10 commits intocode:mainfrom
expo:main
Feb 24, 2026
Merged

[pull] main from expo:main#624
pull[bot] merged 10 commits intocode:mainfrom
expo:main

Conversation

@pull
Copy link

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

chrfalch and others added 10 commits February 24, 2026 16:50
…#43389)

# Why

When running the `GitHub-inspect` tool, we would like to take advantage
of Unblocked's knowledge about our internal systems.

# How

Added support for running Unblocked analysis.

# Test Plan

Run `et gitHub-inspect`

<img width="883" height="369" alt="image"
src="https://github.com/user-attachments/assets/da71497f-60c4-48c8-aaa0-de8cef7e750b"
/>

<img width="826" height="252" alt="image"
src="https://github.com/user-attachments/assets/611c8020-6ff0-42a1-bc7c-17bf29066c53"
/>

<img width="875" height="524" alt="image"
src="https://github.com/user-attachments/assets/c95dd759-0ed7-4c94-ab15-1979f42873a8"
/>
…veAdapter (#43390)

Co-authored-by: Brent Vatne <brentvatne@gmail.com>
…3255)

Co-authored-by: Aman Mittal <amandeepmittal@live.com>
…her (#43395)

# Why

As spotted and reported in DMs, `picomatch` doesn't perform `matchBase`
the same way `minimatch` does and the basename pattern must be
implemented differently to match `minimatch`'s (quirkier) behaviour.

# How

- Update tests and add manual basename matching

# Test Plan

- Unit test added to cover this scenario

# 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)
…ssages (#43329)

# Why

The first `require` call's errors were being swallowed, and the
resulting error that happens after isn't helpful. When `require`
succeeds, we should just issue its error and annotate it.

This PR restores the old transform behaviour for `.js` and `.ts` files,
but with Babel instead to transform ESM to CJS, allowing dual-ESM-CJS in
a single file. The same is done for TypeScript but with TypeScript
itself instead, relying on the `typescript` package. This is done until
we can figure out a better migration path, or tell people to rely on
Node's native behaviour instead.

This behaviour is activated either when `evalModule` is invoked without
a new format argument (which is `null` for the native behaviour) or when
`loadModuleSync` is invoked. This covers both the callsite from
`@expo/config` and `expo-modules-autolinking` sufficiently. The result
of this evaluation is cached in `loadModuleSync` but not in
`evalModule`, since the latter is an explicit call to evaluate.

The "legacy" behaviour basically allows:
- Importing CommonJS modules with ESM, without interop behaviour that'd
turn the CommonJS namespace into the default export
- Using mixed CommonJS and ESM

This only applies to `.js` and `.ts` since `.c[tj]s` and `.m[tj]s`
support is new, and won't need the old behaviour. This explicitly
circumvents the `package.json:type` field as we did before. It also does
not apply to `loadModule`, which is asynchronous, unless loading of
`.js` fails, or native TypeScript loading fails.

(Internal note; See Slack thread for context:
https://exponent-internal.slack.com/archives/C5ERY0TAR/p1771677581725529?thread_ts=1771623609.577789&cid=C5ERY0TAR)

# How

- Fix swallowed error after `require`
- Add ESM-to-CJS transformer with Babel for `commonjs` formats (instead
of Sucrase, but matching options)
- Switch unknown formats to `commonjs` (js is commonjs, ts is
typescript-commonjs now)
- Reuse cached, evaluated module on `loadModuleSync` call

# Test Plan

- Create a test `app.config.js` that contains `import { boolish } from
'getenv'`. Rename to `.mjs` to resolve.
- Create a test `app.config.js` that contains `require`. Rename to
`.cjs` to resolve.
- Repeat the same for `.ts`   

# 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

Follows-up on: #43013

# How

- Add event for env and nodeEnv
- Add event for start implementation (Metro)
- Add event for config/instantiation (Metro)
- Reduce output further when logs+headless are enabled

# Test Plan

- quick tests with `LOG_EVENTS=1 EXPO_UNSTABLE_HEADLESS=1 expo start`

# 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)
…ndencies (#43394)

# Why

Reverts part of #43379

# How

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

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

# 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)
…ions were already granted (#43378)

# Why

Fixes an issue on iOS where `requestPermissionsAsync` would not forward
new authorization options to the operating system when notification
permissions were previously granted. This prevented users from
requesting additional notification permissions (like alerts, badges, or
sounds) after the initial permission grant.

closes #20086, closes #20072

# How

Changed the implementation to call `requestAuthorizationOptions`
directly instead of going through the general permissions system.

A previous attempt (#20086) was rejected because expo go's permission
scoping. However, I noticed that notification permissions on expo go are
not scoped because some 7 years ago they were "temporarily" excluded
from scoping.
So question is, do we want to handle this in a smarter way or have the
exclusion be permanent?

# Test Plan

- notification tester app

<details>
<summary>Details</summary>

```
/**
 * Manual test for #20072
 * Verifies that requestPermissionsAsync forwards new options to the OS
 * even when notifications are already granted.
 *
 * Steps to verify the fix:
 * 1. Press "Request: alert only" → grants notifications with alert
 * 2. Press "Get permissions" → note allowsSound is false
 * 3. Press "Request: alert + sound" → should update options
 * 4. Press "Get permissions" → allowsSound should now be true
 *
 * Before the fix, step 3 would short-circuit and step 4 would still show allowsSound: false.
 */
function PermissionOptionsTest() {
  const [result, setResult] = useState<string>('');

  if (Platform.OS !== 'ios') {
    return null;
  }

  return (
    <>
      <HeadingText>Permission options test (#20072)</HeadingText>
      <Button
        title="1. Request: alert only"
        onPress={async () => {
          const res = await ExpoNotifications.requestPermissionsAsync({
            ios: { allowAlert: true, allowSound: false, allowBadge: false },
          });
          setResult(JSON.stringify(res, null, 2));
        }}
      />
      <Button
        title="2. Request: alert + sound"
        onPress={async () => {
          const res = await ExpoNotifications.requestPermissionsAsync({
            ios: { allowAlert: true, allowSound: true, allowBadge: true },
          });
          setResult(JSON.stringify(res, null, 2));
        }}
      />
      <Button
        title="Get permissions"
        onPress={async () => {
          const res = await ExpoNotifications.getPermissionsAsync();
          setResult(JSON.stringify(res, null, 2));
        }}
      />
      <Text
        selectable
        style={{
          fontFamily: Platform.select({ ios: 'Menlo', default: 'monospace' }),
          fontSize: 11,
        }}>
        {result}
      </Text>
    </>
  );
}
```

</details>

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

---------

Co-authored-by: Expo Bot <34669131+expo-bot@users.noreply.github.com>
Co-authored-by: Tomasz Sapeta <tsapeta@expo.dev>
…#43386)

# Why

When loading expo-modules.config.json files, we don't have a guard for
wrong configurations.

# How

Added unit tests to check problem, and wrapped loading in try..catch
with clear warnings.

# Test Plan

Test in BareExpo

# Checklist

- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
# Why 

We should align the ci-status command with the gitHub-inspect command
and make it smaller and faster.

# How
Rewrite the static et ci-status command as an interactive TUI dashboard,
renamed to et ci-inspect (aliases: ci), matching the UX patterns
established in et github-inspect.

- Interactive category-based navigation (Broken Workflows, Needs
Attention, High Volume Issues, All Workflows) with arrow keys, Enter to
drill down, Esc to go back
- Detail view per workflow with daily trend bar charts, failed run
history, and inline log inspection
  - RECOMMENDED badge on the highest-priority actionable category
- Parallel data fetching for GitHub Actions and EAS workflows with ora
spinner
- Real EAS log fetching in the detail view via eas workflow:view + eas
workflow:logs (replaces the old stub message)
- Fixed success rate calculation to exclude in-progress/queued runs from
the denominator
  - "Needs Attention" category now requires at least one actual failure
- Removed the --inspect CLI flag — the TUI detail view now covers the
same functionality inline
  - Auth warnings only shown when a service is not authenticated

# Test Plan

- Run et ci-inspect and verify interactive navigation through
categories, workflow lists, and detail views
  - Run et ci-inspect -w last to verify week selection still works
  - Run et ci-inspect -b <branch> to verify branch option
  - Verify (f) toggles failed runs in detail view
- Verify (l) downloads and displays error logs for both GitHub Actions
and EAS workflows
  - Verify r reloads data from the workflow list
  - Verify Esc navigates back through each level

<img width="708" height="307" alt="image"
src="https://github.com/user-attachments/assets/d5d8c6c1-df3c-42e7-ae28-94f6fef0bee1"
/>

<img width="705" height="235" alt="image"
src="https://github.com/user-attachments/assets/cf44ae85-c059-4010-8bbf-a2504e44cd51"
/>


<img width="490" height="316" alt="image"
src="https://github.com/user-attachments/assets/18e6c2e3-0833-41c1-b571-d7a5e9915e0f"
/>


<img width="832" height="494" alt="image"
src="https://github.com/user-attachments/assets/dab01f9f-83a0-4ea8-8712-cc0b0a43fe08"
/>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@pull pull bot locked and limited conversation to collaborators Feb 24, 2026
@pull pull bot added the ⤵️ pull label Feb 24, 2026
@pull pull bot merged commit 49c4248 into code:main Feb 24, 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