Skip to content

[pull] main from expo:main#791

Merged
pull[bot] merged 10 commits into
code:mainfrom
expo:main
Apr 21, 2026
Merged

[pull] main from expo:main#791
pull[bot] merged 10 commits into
code:mainfrom
expo:main

Conversation

@pull

@pull pull Bot commented Apr 21, 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 : )

zoontek and others added 10 commits April 21, 2026 11:54
#44956)

# Why

Running `pod install` with `use_expo_modules_tests!` failed because
`expo-task-manager` and `unimodules-app-loader` did not declare a
`test_spec`.

# How

Added a `test_spec` to both podspecs and a minimal `ExpoSpec` that
verifies the shared singleton can be resolved (`EXTaskService.shared`
and `UMAppLoaderProvider.sharedInstance()`).

# Test Plan

Ran the new test targets locally via the generated Xcode workspace and
confirmed both specs pass.

# 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

Align with latest React Native core version.

# How

- Update package versions:
  - react-native 0.85.1 -> 0.85.2
  - @react-native/normalize-colors 0.85.1 -> 0.85.2
  - @react-native/babel-preset 0.85.1 -> 0.85.2
  - @react-native/dev-middleware 0.85.1 -> 0.85.2
  - @react-native/jest-preset 0.85.1 -> 0.85.2
- Add test targets to `ExpoTaskManager` and `UMAppLoader`

# Test Plan

- Run Bare Expo
- Run Minimal tester

# 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)
## Summary
Compared to `main`, this updates `.github/workflows/ios-prebuild-external-xcframeworks.yml` so manual runs can optionally publish per-flavor zip archives of the generated external XCFramework tarballs to GCS.

## What Changed
- add `workflow_dispatch` inputs for `publish` and required `sdk-version`
- keep `packages` and `concurrency` as manual prebuild controls
- validate that `publish=true` is only allowed for full builds, not package-scoped runs (not sure what is the expected flow here if we wanted to allow both `publish` and `packages`. Would we merge ZIP from some previous publish with the newly published partial packages? How would we learn what was the previous publish?)
- add the OIDC permissions needed to authenticate GitHub Actions to Google Cloud
- keep uploading raw XCFramework tarballs to GitHub artifacts before zip packaging
- package available tarballs into `xcframeworks-{Debug|Release}.zip`
- upload those zips to `gs://eas-build-precompiled-modules/precompiled-modules/$SDK_VERSION/...`, allowing reruns to overwrite the same object path
- disable matrix fail-fast and allow partial outputs to continue through artifact upload and GCS upload when packaging produced a zip

## Validation
- Successful smoke run: [24712070220](https://github.com/expo/expo/actions/runs/24712070220)
- GitHub artifact downloads:
  - [xcframeworks-Debug](https://github.com/expo/expo/actions/runs/24712070220/artifacts/6550439823)
  - [xcframeworks-Release](https://github.com/expo/expo/actions/runs/24712070220/artifacts/6550611596)
- GCS uploads:
  - `gs://eas-build-precompiled-modules/precompiled-modules/55.0.2-alpha.0-gcs-smoke.20260421.2/xcframeworks-Debug.zip`
  - `gs://eas-build-precompiled-modules/precompiled-modules/55.0.2-alpha.0-gcs-smoke.20260421.2/xcframeworks-Release.zip`
- `mise exec -- yarn prettier --check .github/workflows/ios-prebuild-external-xcframeworks.yml`
# Why

`@react-native-community/picker` is a popular package and `Picker` is a
very common component. We want to have a drop-in replacement for it in
`expo-ui`.

# How

- New `packages/expo-ui/src/picker/` module with platform-specific
implementations:
- **iOS**: SwiftUI wheel picker via `Host` + `SwiftUIPicker`, supporting
`color` and `fontFamily` per item.
- **Android**: `ExposedDropdownMenuBox` via `Host` + `SegmentedButton`,
supporting per-item `enabled`.
  - **Web**: Throws with guidance to use `<select>`.
- NCL example screen (`CommunityPickerScreen`) demonstrating standard,
styled, disabled, colored, font-family, and item-enabled variants.

# Test Plan

1. Open NCL → UI → Community Picker on iOS and Android.
2. Verify all sections render and selection works (selected value text
updates).
3. "Disabled" section: confirm the picker is not interactive.
4. "Item color" (iOS): confirm colored text on each item.
5. "Item enabled" (Android): confirm disabled items cannot be selected.

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

The prebuild step is NOT `continue-on-error` — a failed build must fail
the job so broken runs are visible in the UI. Now the job is green even
when prebuild fails.

# How

Removed continue-on-error: true and switched cancel() checks to
success() checks to fix that the workflow went green even when prebuild
failed.

# Test Plan

Run workflow
# Why

The scheduler unblocked dependents as soon as a dependency finished,
without checking whether it actually succeeded.

So when react-native-worklets fails, react-native-reanimated (which
depends on RNWorklets) will still be launched — and either cascaded a
misleading "xcframework not found, please build worklets first" error
that buried the real root cause, or, on machines with a stale
RNWorklets.xcframework left over from a previous good build, silently
built against the stale artifact — which is where the non-deterministic
failures came from.

The fix tracks failed packages in the scheduler and short-circuits
dependents before they run, so a failed upstream always prevents a
downstream build instead of racing with the filesystem.

# How

Scheduler.ts:
- Added a failedOrDoomed: Set<string> next to the existing completed
set.
- When a package returns with result.errors.length > 0, it goes into
that set.
- Before launching any package, compute failedDeps = package.deps ∩
failedOrDoomed. If non-empty, pass that list through to the executor as
a third argument.
- Because synthesized skip-results also carry errors, the poison
propagates transitively through the DAG without any extra logic — a
dependent that's skipped becomes "failed" itself and poisons its
dependents.

Executor.ts:
- In the scheduler callback, if failedDeps is non-empty: log ⏭️ Skipping
<pkg> — dependency failed: <deps> and return a
synthesizeSkippedResult(...) instead of actually running.
- synthesizeSkippedResult produces one UnitStatus (all stages 'skipped',
with a skipReason string) + one UnitError per product × flavor, so the
summary, error log, and exit code all reflect the skip without touching
disk.

Reporter.ts:
- A unit with skipReason is rendered as a single-line ⛔ Skipped
(dependency X failed) and counted as failed — so the summary is visually
distinct from a real generate failure and the ❌ N failed total stays
honest. Net effect: a failed upstream deterministically prevents its
downstream from running, regardless of what leftover artifacts happen to
be on disk.
# Why

After upgrading to REA 4.3.0 and RNWorklets 0.8.1 the prebuild failed
due to missing headers

# How

Fixed by adding missing header directories to spm.config.json

# Test-plan

Run prebiuld on main:
`et prebuild -f Debug --external-only --clean`
@pull pull Bot locked and limited conversation to collaborators Apr 21, 2026
@pull pull Bot added the ⤵️ pull label Apr 21, 2026
@pull pull Bot merged commit 3429dc8 into code:main Apr 21, 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.

7 participants