Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
77dba33
feat: add initial Expo 56 support
adamTrz Jun 1, 2026
51a2504
refactor: inherit Expo native floors from app project
adamTrz Jun 2, 2026
7485c54
fix: stabilize RNApp brownfield test apps
adamTrz Jun 2, 2026
14a7e6d
chore: refresh lockfile for Expo peer range
adamTrz Jun 3, 2026
03058b1
fix: avoid duplicating iOS brownfield targets
adamTrz Jun 3, 2026
8b265fb
feat: stabilize Expo 56 support matrix
adamTrz Jun 10, 2026
6965241
Merge origin/main into adamTrz/expo-56-support
adamTrz Jun 11, 2026
7941b34
fix: restore gradle plugin string extension import
adamTrz Jun 11, 2026
605d8a4
fix: align android expo CI artifact checks
adamTrz Jun 11, 2026
e7ab02e
fix: support expo android maven artifact naming
adamTrz Jun 11, 2026
37c7d63
fix: support Expo 55/56 iOS packaging
adamTrz Jun 11, 2026
492effa
fix: normalize Expo prebuilt iOS flags in CI
adamTrz Jun 11, 2026
4d7b7ac
fix: normalize Expo iOS search paths in CI
adamTrz Jun 12, 2026
b688147
fix: disable Expo release swift interface verification
adamTrz Jun 12, 2026
aefc614
Merge origin/main into adamTrz/expo-56-support
adamTrz Jun 12, 2026
a6abbdc
fix: stabilize Expo and bare RN example builds
adamTrz Jun 12, 2026
b0fd33f
fix: address expo 56 PR review feedback
adamTrz Jun 16, 2026
a94ba5d
Merge remote-tracking branch 'origin/main' into adamTrz/expo-56-support
adamTrz Jun 16, 2026
bc5181e
fix: tighten expo 56 android support changes
adamTrz Jun 18, 2026
acd801f
refactor: drop custom iOS packaging path from expo 56 PR
adamTrz Jun 18, 2026
d3c75d4
chore: sync expo 56 branch with main
adamTrz Jun 18, 2026
bc42f74
fix: restore expo56 CI coverage
adamTrz Jun 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/calm-poets-film.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'brownfield': patch

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is missing react-native-brownfield

'@callstack/react-native-brownfield': patch
---

feat: support Expo SDK 56 in the Brownfield package and example apps
21 changes: 15 additions & 6 deletions .github/actions/androidapp-road-test/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,21 @@ runs:
yarn run brownfield:publish:android
shell: bash

- name: Verify debug AAR exists in Maven Local
run: stat ~/.m2/repository/${{ inputs.rn-project-maven-path }}/0.0.1-SNAPSHOT/brownfieldlib-0.0.1-SNAPSHOT-debug.aar
shell: bash

- name: Verify release AAR exists in Maven Local
run: stat ~/.m2/repository/${{ inputs.rn-project-maven-path }}/0.0.1-SNAPSHOT/brownfieldlib-0.0.1-SNAPSHOT-release.aar
- name: Verify published AAR exists in Maven Local
run: |
artifact_dir=~/.m2/repository/${{ inputs.rn-project-maven-path }}/0.0.1-SNAPSHOT
release_artifact="$artifact_dir/brownfieldlib-0.0.1-SNAPSHOT-release.aar"
default_artifact="$artifact_dir/brownfieldlib-0.0.1-SNAPSHOT.aar"

if [ -f "$release_artifact" ]; then
stat "$release_artifact"
elif [ -f "$default_artifact" ]; then
stat "$default_artifact"
else
echo "Expected published AAR was not found in $artifact_dir"
ls -la "$artifact_dir"
exit 1
fi
shell: bash

# == AndroidApp ==
Expand Down
10 changes: 9 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ jobs:
rnapp: ${{ steps.filter.outputs.rnapp }}
expo54: ${{ steps.filter.outputs.expo54 }}
expo55: ${{ steps.filter.outputs.expo55 }}
expo56: ${{ steps.filter.outputs.expo56 }}
androidapp: ${{ steps.filter.outputs.androidapp }}
appleapp: ${{ steps.filter.outputs.appleapp }}
ci: ${{ steps.filter.outputs.ci }}
Expand All @@ -47,6 +48,9 @@ jobs:
expo55:
- 'apps/ExpoApp55/**'
- 'apps/brownfield-example-shared-tests/**'
expo56:
- 'apps/ExpoApp56/**'
- 'apps/brownfield-example-shared-tests/**'
androidapp:
- 'apps/AndroidApp/**'
appleapp:
Expand Down Expand Up @@ -129,6 +133,7 @@ jobs:
(
needs.filter.outputs.expo54 == 'true' ||
needs.filter.outputs.expo55 == 'true' ||
needs.filter.outputs.expo56 == 'true' ||
needs.filter.outputs.androidapp == 'true' ||
needs.filter.outputs.packages == 'true' ||
needs.filter.outputs.ci == 'true'
Expand All @@ -139,6 +144,7 @@ jobs:
include:
- version: '54'
- version: '55'
- version: '56'

steps:
- name: Checkout
Expand Down Expand Up @@ -213,6 +219,7 @@ jobs:
(
needs.filter.outputs.expo54 == 'true' ||
needs.filter.outputs.expo55 == 'true' ||
needs.filter.outputs.expo56 == 'true' ||
needs.filter.outputs.appleapp == 'true' ||
needs.filter.outputs.packages == 'true' ||
needs.filter.outputs.ci == 'true'
Expand All @@ -225,6 +232,8 @@ jobs:
run-e2e: 'false'
- version: '55'
run-e2e: 'true'
- version: '56'
run-e2e: 'true'

steps:
- name: Checkout
Expand All @@ -237,4 +246,3 @@ jobs:
rn-project-path: apps/ExpoApp${{ matrix.version }}
run-e2e: ${{ matrix.run-e2e }}
e2e-artifact-name: detox-appleapp-expo${{ matrix.version }}

56 changes: 56 additions & 0 deletions .yarn/patches/expo-modules-core-npm-55.0.25-brownfield.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
diff --git a/android/cmake/main.cmake b/android/cmake/main.cmake
index 2fa3ea0c3d7d9771729ad55de63185fdb90a3520..ff72a20c4fcb36e737e2fb2840cbf6a51a2e15d2 100644
--- a/android/cmake/main.cmake
+++ b/android/cmake/main.cmake
@@ -71,22 +71,31 @@ if (REACT_NATIVE_WORKLETS_DIR)
if (REACT_NATIVE_WORKLETS_DIR)
- add_library(worklets SHARED IMPORTED)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For this and reanimated patch, I believe these were added as you might get errors for gradlew clean? If yes, we can discard these patches.

-
- if (${CMAKE_BUILD_TYPE} MATCHES "Debug")
- set(BUILD_TYPE "debug")
- else ()
- set(BUILD_TYPE "release")
- endif ()
-
- set_target_properties(
- worklets
- PROPERTIES
- IMPORTED_LOCATION
- "${REACT_NATIVE_WORKLETS_DIR}/android/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libworklets.so"
- )
-
- target_link_libraries(
- expo-modules-core
- PRIVATE
- worklets
- )
+ find_package(react-native-worklets CONFIG QUIET)
+ if (react-native-worklets_FOUND)
+ target_link_libraries(
+ expo-modules-core
+ PRIVATE
+ react-native-worklets::worklets
+ )
+ else ()
+ add_library(worklets SHARED IMPORTED)
+
+ if (${CMAKE_BUILD_TYPE} MATCHES "Debug")
+ set(BUILD_TYPE "debug")
+ else ()
+ set(BUILD_TYPE "release")
+ endif ()
+
+ set_target_properties(
+ worklets
+ PROPERTIES
+ IMPORTED_LOCATION
+ "${REACT_NATIVE_WORKLETS_DIR}/android/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libworklets.so"
+ )
+
+ target_link_libraries(
+ expo-modules-core
+ PRIVATE
+ worklets
+ )
+ endif ()
endif ()
13 changes: 13 additions & 0 deletions .yarn/patches/expo-updates-npm-56.0.17-0d9c6d9af6.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git a/ios/EXUpdates.podspec b/ios/EXUpdates.podspec
index c3d463384cc660c413e6f29ae9990fa1421661d8..f347621cc9f51ca4efd4f8d696918c82767e6e14 100644
--- a/ios/EXUpdates.podspec
+++ b/ios/EXUpdates.podspec
@@ -15,7 +15,7 @@ begin
# No dev client if we are using native debug
if ENV['EX_UPDATES_NATIVE_DEBUG'] != '1'
project_root = ENV['PROJECT_ROOT'] || Pod::Config.instance.installation_root.to_s
- use_dev_client = File.dirname(`node --print "require.resolve('expo-dev-client/package.json', { paths: ['#{__dir__}', '#{project_root}'] })"`).length > 0
+ use_dev_client = File.dirname(`node --print "try { require.resolve('expo-dev-client/package.json', { paths: ['#{__dir__}', '#{project_root}'] }) } catch { '' }"`).length > 0
Comment on lines +9 to +10

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Context?

end
rescue
use_dev_client = false
31 changes: 31 additions & 0 deletions .yarn/patches/react-native-reanimated-npm-4.2.1-brownfield.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt
index 0c2c3c92ba1d53c14a342ebcd21342ba8141a853..c2ee77d25009a220225f8f2345925f4cc99c72db 100644
--- a/android/CMakeLists.txt
+++ b/android/CMakeLists.txt
@@ -46,2 +46,3 @@ find_package(fbjni REQUIRED CONFIG)
find_package(ReactAndroid REQUIRED CONFIG)
+find_package(react-native-worklets REQUIRED CONFIG)

@@ -77,14 +78,0 @@ set_target_properties(reanimated PROPERTIES LINKER_LANGUAGE CXX)
-if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
- set(BUILD_TYPE "debug")
-else()
- set(BUILD_TYPE "release")
-endif()
-
-add_library(worklets SHARED IMPORTED)
-
-set_target_properties(
- worklets
- PROPERTIES
- IMPORTED_LOCATION
- "${REACT_NATIVE_WORKLETS_DIR}/android/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libworklets.so"
-)
@@ -107,5 +94,5 @@ target_link_libraries(
ReactAndroid::reactnative
ReactAndroid::jsi
fbjni::fbjni
- android
- worklets)
+ android
+ react-native-worklets::worklets)
6 changes: 5 additions & 1 deletion apps/AndroidApp/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ android {
create("expo55") {
dimension = "app"
}
create("expo56") {
dimension = "app"
}
create("expobeta") {
dimension = "app"
}
Expand Down Expand Up @@ -75,8 +78,9 @@ dependencies {
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.appcompat)
add("expo55Implementation", libs.brownfieldlib.expo55)
add("expobetaImplementation", libs.brownfieldlib.expobeta)
add("expo56Implementation", libs.brownfieldlib.expo56)
add("expo54Implementation", libs.brownfieldlib.expo54)
add("expobetaImplementation", libs.brownfieldlib.expobeta)
add("vanillaImplementation", libs.brownfieldlib.vanilla)

implementation(libs.androidx.fragment.compose)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.callstack.brownfield.android.example

typealias BrownfieldStore = com.callstack.rnbrownfield.demo.expoapp56.BrownfieldStore
typealias User = com.callstack.rnbrownfield.demo.expoapp56.User
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.callstack.brownfield.android.example

object ReactNativeConstants {
const val MAIN_MODULE_NAME = "main"
const val APP_NAME = "Android (Expo 56)"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.callstack.brownfield.android.example

typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.expoapp56.ReactNativeHostManager
2 changes: 1 addition & 1 deletion apps/AndroidApp/gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ gson = "2.13.2"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
brownfieldlib-expo56 = { module = "com.callstack.rnbrownfield.demo.expoapp56:brownfieldlib", version.ref = "brownfieldlib" }
brownfieldlib-expo55 = { module = "com.callstack.rnbrownfield.demo.expoapp55:brownfieldlib", version.ref = "brownfieldlib" }
brownfieldlib-expobeta = { module = "com.callstack.rnbrownfield.demo.expobeta:brownfieldlib", version.ref = "brownfieldlib" }
brownfieldlib-expo54 = { module = "com.callstack.rnbrownfield.demo.expoapp54:brownfieldlib", version.ref = "brownfieldlib" }
Expand All @@ -41,4 +42,3 @@ gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

3 changes: 2 additions & 1 deletion apps/AndroidApp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
"version": "0.0.1",
"private": true,
"scripts": {
"build:example:android-consumer:expo": "./gradlew assembleExpo55Release",
"build:example:android-consumer:expo": "./gradlew assembleExpo56Release",
"build:example:android-consumer:expo56": "./gradlew assembleExpo56Release",
"build:example:android-consumer:expo55": "./gradlew assembleExpo55Release",
"build:example:android-consumer:expobeta": "./gradlew assembleExpobetaRelease",
"build:example:android-consumer:expo54": "./gradlew assembleExpo54Release",
Expand Down
17 changes: 17 additions & 0 deletions apps/AppleApp/.detoxrc.expo56.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const {
createAppleAppIosSimDebugDetoxConfig,
} = require('../brownfield-example-shared-tests/detox-rc-appleapp-ios-sim-debug.cjs');
const {
getAppleAppDetoxVariant,
} = require('../brownfield-example-shared-tests/detox-appleapp-variants.cjs');

const variant = getAppleAppDetoxVariant('expo56');

/** @type {import('detox').DetoxConfig} */
module.exports = createAppleAppIosSimDebugDetoxConfig({
scheme: variant.scheme,
configuration: variant.configuration,
appBinaryName: variant.appBinaryName,
detoxConfiguration: variant.detoxConfiguration,
jestConfigPath: 'e2e/jest.config.expo56.cjs',
});
Loading
Loading