Skip to content

[pull] main from expo:main - #1202

Merged
pull[bot] merged 8 commits into
code:mainfrom
expo:main
Sep 1, 2026
Merged

[pull] main from expo:main#1202
pull[bot] merged 8 commits into
code:mainfrom
expo:main

Conversation

@pull

@pull pull Bot commented Sep 1, 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 : )

Den1Marshall and others added 8 commits September 1, 2026 12:03
# Why

Several SwiftUI modifiers paint an area with a `ShapeStyle`:
`foregroundStyle`,
`background`, shape fills. Expo UI described that vocabulary once,
inside
`ForegroundStyleModifier`, in a form nothing else could reuse – a flat
record
plus two near-identical `switch` statements, one returning a `View` and
one a
`Text`. Adding the same styles to `background` meant copying both.

# How

`ShapeStyleValue` resolves a style into a single `AnyShapeStyle`. The
erasure is
what makes sharing possible: an opaque `some ShapeStyle` has to be one
concrete
type across every branch, and an existential `any ShapeStyle` cannot
escape into
the result of `background(_:)` or `foregroundStyle(_:)`, so a style
chosen at
runtime cannot be returned any other way. `AnyShapeStyle` is available
since
iOS 15, below the package's 16.4 minimum.

`foregroundStyle` now delegates to it and shrinks from 125 lines to 34.
Its
public union is unchanged except for a new `material` variant, so
existing calls
keep working; the payload nests under a `style` key, which is what the
two
updated tests assert.

Materials cover the five thickness levels and `bar`. `bar` has no tvOS
counterpart and `quinary` needs tvOS 17; both leave the view untouched
there
rather than failing, since the same JS runs on every platform and the
modifier
array is rebuilt on each render.

# Test Plan

Added a "Material foreground style" section to the modifiers screen in
native-component-list: text painted with a material over a
gradient-filled
rectangle. Verified in bare-expo on the iOS simulator.

`et check-packages @expo/ui` passes, the app builds (`BUILD SUCCEEDED`)
and the
package tests pass (24 suites, 129 tests).

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
- [x] Conforms with the Documentation Writing Style Guide

Co-authored-by: nishan (o^▽^o) <nishanbende@gmail.com>
…` headers (#49203)

# Why

A prebuilt pod's headers only exist inside its XCFramework. CocoaPods
populates `Pods/Headers/Public/<Pod>` only while a pod builds from
source.

This can cause errors with `headers not found` when combining source
built and prebuilt pods.

This is an addition and complimentary fix to #49147.

# How

Walk the CocoaPods dependency graph and append each prebuilt
dependency's XCFramework header directories to the HEADER_SEARCH_PATHS
of the source-built pods that depend on it. Add skip list to avoid
injecting header search paths for pods that gets their search paths
injected by other mechanisms (ExpoModulesCore, React**).

# Reproduction

- Create Expo app with expo-router
- Use prebuilt 3rd party xcframeworks like we do in EAS build
(EXPO_PRECOMPILED_MODULES_BASE_URL)
- Set RNGH to build as source (causes it to try to look for header files
in the `Pods/Headers/Public` for Worklets which is prebuilt

**Observe**: Result: exit 65, 'worklets/Compat/StableApi.h' file not
found at RNGHRuntimeDecorator.cpp:11

# Test Plan

✅ Run the same as the reproduction above
✅ Run the reproduction above - with `use_frameworks!` (dynamic/static)

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

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Expo Bot <34669131+expo-bot@users.noreply.github.com>
…eplacing them (#49504)

# Why
Follow up from the review of #49458 

assets.key is unique, and addNewAssets inserted with INSERT OR REPLACE.
On a key conflict, the REPLACE deletes the existing row before
inserting, and we run with foreign keys enforced, so the delete
cascades. Any update using that asset as its launch asset is deleted
through updates.launch_asset_id ON DELETE CASCADE, and every other
update sharing the asset loses its updates_assets rows. One registration
can silently erase or gut updates it has nothing to do with.

# How
When registering a new asset whose key already exists, adopt the
existing row instead of replacing it. addNewAssetsInternal now calls the
existing addExistingAsset first, which links the join row and sets
launch_asset_id when flagged, and only falls through to the insert when
the key is absent. The check runs inside the registration transaction,
so it cannot race. The insert itself drops OR REPLACE, so any conflict
that could still occur aborts the transaction rather than deleting rows.

# Test Plan
New tests in UpdatesDatabaseTests
…of replacing them (#49505)

# Why
Same issue as the pr below but for android

# How
insertAssets already runs as a @transaction, so it now calls the
existing addExistingAssetToUpdate first, which adopts the row, links it,
and sets the launch asset when flagged

# Test Plan
New tests in UpdatesDatabaseTest
…s, other) (#49581)

Automated upstream sync of generated reference content.

| Generator | Status |
| --- | --- |
| App config schema | ➖ No changes |
| Expo Skills | ✅ Synced |
| EAS CLI reference | ✅ Synced |
| Android permissions | ➖ No changes |

## Files
- `docs/pages/eas/cli.mdx`
- `docs/ui/components/EASCLIReference/data/eas-cli-commands.json`
- `docs/ui/components/ExpoSkillsTable/data/expo-skills.json`

Co-authored-by: Expo Bot <expo-bot@users.noreply.github.com>
@pull pull Bot locked and limited conversation to collaborators Sep 1, 2026
@pull pull Bot added the ⤵️ pull label Sep 1, 2026
@pull
pull Bot merged commit ba0f9db into code:main Sep 1, 2026
11 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.

5 participants