Skip to content

Commit dee9559

Browse files
authored
refactor: drop support for expo 54 (#407)
* refactor: drop support for expo 54 * chore: run changeset * refactor: remove trailing expo 54 references * fix: restore prebuilt rn core * fix: review * docs: update version matrix
1 parent ae4e61f commit dee9559

86 files changed

Lines changed: 84 additions & 4180 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.changeset/config.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@
2222
"@callstack/brownfield-example-android-app",
2323
"@callstack/brownfield-example-ios-app",
2424
"@callstack/brownfield-example-rn-app",
25-
"@callstack/brownfield-example-expo-app-54",
2625
"@callstack/brownfield-example-expo-app-55",
27-
"@callstack/brownfield-gradle-plugin-react"
26+
"@callstack/brownfield-example-expo-app-56",
27+
"@callstack/brownfield-gradle-plugin-react",
28+
"@callstack/brownfield-example-shared-tests"
2829
],
2930
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
3031
"onlyUpdatePeerDependentsWhenOutOfRange": true,

.changeset/good-ravens-rule.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@callstack/react-native-brownfield': major
3+
'@callstack/brownfield-cli': major
4+
---
5+
6+
feat: drop support for expo sdk 54

.github/actions/prepare-android/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ inputs:
2323
default: 'false'
2424

2525
gradle-workflow-job-context:
26-
description: 'Segment Gradle cache per app/project (e.g. vanilla, expo54). Falls back to github.job when empty.'
26+
description: 'Segment Gradle cache per app/project (e.g. vanilla, expo55). Falls back to github.job when empty.'
2727
required: false
2828
default: ''
2929

CONTRIBUTING.md

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ We use [changesets](https://github.com/changesets/changesets) to make it easier
2929
- `lint` - runs linting on all JS/TS source files in the monorepo _[Turbo]_
3030
- `gradle-plugin:lint` - runs linting on the Brownfield Gradle plugin source code
3131
- `typecheck` - runs TypeScript type checking on all TS source files in the monorepo _[Turbo]_
32-
- `test:apps` - runs Jest for the React Native example apps under `apps/` (Expo 54, Expo 55, plain RN) _[Turbo]_
32+
- `test:apps` - runs Jest for the React Native example apps under `apps/` (Expo 55, plain RN) _[Turbo]_
3333
- `build` - runs all `build*` tasks in the Turbo repo - see below for more details _[Turbo]_
3434
- `dev` - runs all `dev` tasks in all workspaces
3535
- `brownfield:plugin:publish:local` - publishes the Brownfield Gradle plugin to your local Maven repository for testing purposes
@@ -38,11 +38,9 @@ We use [changesets](https://github.com/changesets/changesets) to make it easier
3838
- `build:example:android-rn` - builds the example React Native app for Android (`apps/RNApp/android`)
3939
- `build:example:ios-rn` - builds the example React Native app for iOS (`apps/RNApp/ios`)
4040
- `build:example:android-consumer:expo55` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the Expo 55 RN app (`apps/ExpoApp55`) artifact
41-
- `build:example:android-consumer:expo54` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the Expo 54 RN app (`apps/ExpoApp54`) artifact
4241
- `build:example:android-consumer:vanilla` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the vanilla RN app (`apps/RNApp`) artifact
4342
- `build:example:ios-consumer:expo` - alias for `build:example:ios-consumer:expo55`
4443
- `build:example:ios-consumer:expo55` - builds the `Brownfield Apple App (ExpoApp55)` target via scheme **Brownfield Apple App Expo 55** (`Release`)
45-
- `build:example:ios-consumer:expo54` - builds the `Brownfield Apple App (ExpoApp54)` target via scheme **Brownfield Apple App Expo 54** (`Release`)
4644
- `build:example:ios-consumer:vanilla` - builds the `Brownfield Apple App (RNApp)` target via scheme **Brownfield Apple App Vanilla** (`Release Vanilla`)
4745

4846
## Running demo apps
@@ -65,20 +63,17 @@ There are 2 brownfield host apps.
6563
> Each of the scripts below requires you to **first** package the consumed RN application with `yarn brownfield:package:ios`, e.g. `cd apps/ExpoApp55 && yarn brownfield:package:ios`.
6664
6765
- `apps/AndroidApp` - for Android
68-
- `build:example:android-consumer:expo54` - consumes Expo 54
6966
- `build:example:android-consumer:expo55` - consumes Expo 55
7067
- `build:example:android-consumer:vanilla` - consumes the vanilla `RNApp`
71-
- `apps/AppleApp` - for Apple (three Xcode targets, each with its own shared scheme)
72-
- `build:example:ios-consumer:expo54` — target `Brownfield Apple App (ExpoApp54)`, scheme **Brownfield Apple App Expo 54**
68+
- `apps/AppleApp` - for Apple (two Xcode targets, each with its own shared scheme)
7369
- `build:example:ios-consumer:expo55` (or `expo`) — target `Brownfield Apple App (ExpoApp55)`, scheme **Brownfield Apple App Expo 55**
7470
- `build:example:ios-consumer:vanilla` — target `Brownfield Apple App (RNApp)`, scheme **Brownfield Apple App Vanilla**
7571

76-
For iOS, these scripts validate the legacy direct-XCFramework integration path. Each script uses the previously packaged artifacts from the respective directory (`apps/RNApp`, `apps/ExpoApp54`, or `apps/ExpoApp55`), invokes `prepareXCFrameworks.js` to copy XCFrameworks into `apps/AppleApp/package`, then runs `xcodebuild` against the matching scheme. The Xcode project reads fixed paths under `package/` (for example `package/BrownfieldLib.xcframework`).
72+
For iOS, these scripts validate the legacy direct-XCFramework integration path. Each script uses the previously packaged artifacts from the respective directory (`apps/RNApp` or `apps/ExpoApp55`), invokes `prepareXCFrameworks.js` to copy XCFrameworks into `apps/AppleApp/package`, then runs `xcodebuild` against the matching scheme. The Xcode project reads fixed paths under `package/` (for example `package/BrownfieldLib.xcframework`).
7773

7874
| Yarn script | RN app | Xcode target | Scheme | Configuration |
7975
| ------------------------------------ | ----------- | ---------------------------------- | ---------------------------- | ----------------- |
8076
| `build:example:ios-consumer:vanilla` | `RNApp` | `Brownfield Apple App (RNApp)` | Brownfield Apple App Vanilla | `Release Vanilla` |
81-
| `build:example:ios-consumer:expo54` | `ExpoApp54` | `Brownfield Apple App (ExpoApp54)` | Brownfield Apple App Expo 54 | `Release` |
8277
| `build:example:ios-consumer:expo55` | `ExpoApp55` | `Brownfield Apple App (ExpoApp55)` | Brownfield Apple App Expo 55 | `Release` |
8378

8479
> [!IMPORTANT]
@@ -94,11 +89,9 @@ The local Swift Package Manager flow is separate from `prepareXCFrameworks.js`.
9489
2. Open `apps/AppleApp/Brownfield Apple App.xcodeproj`.
9590
3. Select the host scheme you want to validate:
9691
- `Brownfield Apple App Vanilla`
97-
- `Brownfield Apple App Expo 54`
9892
- `Brownfield Apple App Expo 55`
9993
4. In Xcode, go to `Package Dependencies`, click `+`, choose `Add Local...`, and select the generated package folder:
10094
- `apps/RNApp/ios/.brownfield/package/build`
101-
- `apps/ExpoApp54/ios/.brownfield/package/build`
10295
- `apps/ExpoApp55/ios/.brownfield/package/build`
10396
5. Add the `BrownfieldLib` product to the matching AppleApp target.
10497
6. Remove old direct `package/*.xcframework` references from that target if you are switching from the legacy direct-XCFramework path.
@@ -120,10 +113,9 @@ Per example app (run from the repo root):
120113
| Command | App |
121114
| --------------------------------------------------------------- | --------------------------------- |
122115
| `yarn workspace @callstack/brownfield-example-rn-app test` | Plain React Native (`apps/RNApp`) |
123-
| `yarn workspace @callstack/brownfield-example-expo-app-54 test` | Expo SDK 54 (`apps/ExpoApp54`) |
124116
| `yarn workspace @callstack/brownfield-example-expo-app-55 test` | Expo SDK 55 (`apps/ExpoApp55`) |
125117

126-
Package-level scripts (`yarn test` inside `apps/RNApp`, `apps/ExpoApp54`, or `apps/ExpoApp55`) invoke Jest with each app’s `jest.config.js`.
118+
Package-level scripts (`yarn test` inside `apps/RNApp` or `apps/ExpoApp55`) invoke Jest with each app’s `jest.config.js`.
127119

128120
The native-only sample apps (`apps/AppleApp`, `apps/AndroidApp`) use their platform test runners (Xcode / Gradle), not Jest.
129121

@@ -137,15 +129,15 @@ E2E runs without Metro: the Debug simulator build embeds `main.jsbundle` (`FORCE
137129

138130
| Path | What it exercises | Typical flow |
139131
| ----------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
140-
| RN host app (`RNApp`, `ExpoApp54`, `ExpoApp55`) | Brownfield RN app running as the simulator target | `expo prebuild` / pods → Detox build → Detox test |
132+
| RN host app (`RNApp`, `ExpoApp55`) | Brownfield RN app running as the simulator target | `expo prebuild` / pods → Detox build → Detox test |
141133
| native host app (`AppleApp`) | Native host app consuming a packaged `BrownfieldLib` XCFramework | `brownfield:package:ios` → copy XCFrameworks into `AppleApp/package` → Detox build → Detox test |
142134

143135
Per-app Detox scripts (run from the app directory):
144136

145137
| App | Build | Test | Shared spec |
146138
| ------------------------- | --------------------------- | -------------------------- | ---------------------------------- |
147139
| `RNApp` | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `rnAppBrownfield.e2e.js` |
148-
| `ExpoApp54` / `ExpoApp55` | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `expoPostMessageBrownfield.e2e.js` |
140+
| `ExpoApp55` | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `expoPostMessageBrownfield.e2e.js` |
149141
| `AppleApp` (vanilla) | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `appleAppBrownfield.e2e.js` |
150142
| `AppleApp` (Expo 55) | `yarn e2e:build:ios:expo55` | `yarn e2e:test:ios:expo55` | `appleAppExpoBrownfield.e2e.js` |
151143

@@ -156,7 +148,6 @@ iOS Detox E2E runs in [`.github/workflows/ci.yml`](.github/workflows/ci.yml) via
156148
| Job | E2E | Notes |
157149
| ----------------------------- | --- | ---------------------------------------- |
158150
| `ios-appleapp-vanilla` | Yes | `RNApp` → package → `AppleApp` Detox |
159-
| `ios-appleapp-expo` (Expo 54) | No | Road test only (Release build) |
160151
| `ios-appleapp-expo` (Expo 55) | Yes | `ExpoApp55` → package → `AppleApp` Detox |
161152

162153
On failure, CI uploads `apps/AppleApp/e2e-artifacts/` as a workflow artifact (`detox-appleapp-*-ios-recordings`).
@@ -170,7 +161,6 @@ From the repo root (macOS + Xcode + Simulator required). All wrap `scripts/ci-lo
170161
| Command | Mirrors |
171162
| --------------------------------------- | -------------------------------- |
172163
| `yarn ci:local:rnapp:e2e:ios` | RN host app E2E (`apps/RNApp`) |
173-
| `yarn ci:local:expo54:e2e:ios` | Expo 54 host app E2E |
174164
| `yarn ci:local:expo55:e2e:ios` | Expo 55 host app E2E |
175165
| `yarn ci:local:appleapp:e2e:ios` | CI `ios-appleapp-vanilla` |
176166
| `yarn ci:local:appleapp:e2e:ios:expo55` | CI `ios-appleapp-expo` (Expo 55) |

apps/AndroidApp/app/build.gradle.kts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ android {
3030

3131
flavorDimensions += "app"
3232
productFlavors {
33-
create("expo54") {
34-
dimension = "app"
35-
}
3633
create("expo55") {
3734
dimension = "app"
3835
}
@@ -80,7 +77,6 @@ dependencies {
8077
implementation(libs.androidx.appcompat)
8178
add("expo55Implementation", libs.brownfieldlib.expo55)
8279
add("expo56Implementation", libs.brownfieldlib.expo56)
83-
add("expo54Implementation", libs.brownfieldlib.expo54)
8480
add("expobetaImplementation", libs.brownfieldlib.expobeta)
8581
add("vanillaImplementation", libs.brownfieldlib.vanilla)
8682

apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt

Lines changed: 0 additions & 4 deletions
This file was deleted.

apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt

Lines changed: 0 additions & 6 deletions
This file was deleted.

apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt

Lines changed: 0 additions & 3 deletions
This file was deleted.

apps/AndroidApp/gradle/libs.versions.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref =
1919
brownfieldlib-expo56 = { module = "com.callstack.rnbrownfield.demo.expoapp56:brownfieldlib", version.ref = "brownfieldlib" }
2020
brownfieldlib-expo55 = { module = "com.callstack.rnbrownfield.demo.expoapp55:brownfieldlib", version.ref = "brownfieldlib" }
2121
brownfieldlib-expobeta = { module = "com.callstack.rnbrownfield.demo.expobeta:brownfieldlib", version.ref = "brownfieldlib" }
22-
brownfieldlib-expo54 = { module = "com.callstack.rnbrownfield.demo.expoapp54:brownfieldlib", version.ref = "brownfieldlib" }
2322
brownfieldlib-vanilla = { module = "com.rnapp:brownfieldlib", version.ref = "brownfieldlib" }
2423
junit = { group = "junit", name = "junit", version.ref = "junit" }
2524
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }

apps/AndroidApp/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
"build:example:android-consumer:expo56": "./gradlew assembleExpo56Release",
88
"build:example:android-consumer:expo55": "./gradlew assembleExpo55Release",
99
"build:example:android-consumer:expobeta": "./gradlew assembleExpobetaRelease",
10-
"build:example:android-consumer:expo54": "./gradlew assembleExpo54Release",
1110
"build:example:android-consumer:vanilla": "./gradlew assembleVanillaRelease"
1211
}
1312
}

0 commit comments

Comments
 (0)