diff --git a/.changeset/config.json b/.changeset/config.json index bd989597..c2bdd575 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -22,7 +22,6 @@ "@callstack/brownfield-example-android-app", "@callstack/brownfield-example-ios-app", "@callstack/brownfield-example-rn-app", - "@callstack/brownfield-example-expo-app-55", "@callstack/brownfield-example-expo-app-56", "@callstack/brownfield-gradle-plugin-react", "@callstack/brownfield-example-shared-tests", diff --git a/.github/actions/prepare-android/action.yml b/.github/actions/prepare-android/action.yml index ab9af4a4..7db104ad 100644 --- a/.github/actions/prepare-android/action.yml +++ b/.github/actions/prepare-android/action.yml @@ -23,12 +23,12 @@ inputs: default: 'false' gradle-workflow-job-context: - description: 'Segment Gradle cache per app/project (e.g. vanilla, expo55). Falls back to github.job when empty.' + description: 'Segment Gradle cache per app/project (e.g. vanilla, expo56). Falls back to github.job when empty.' required: false default: '' rn-project-path: - description: 'Optional RN app path for native ccache key segmentation (e.g. apps/ExpoApp55)' + description: 'Optional RN app path for native ccache key segmentation (e.g. apps/ExpoApp56)' required: false default: '' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 35d7cca9..470d2e2d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,8 @@ jobs: outputs: packages: ${{ steps.filter.outputs.packages }} rnapp: ${{ steps.filter.outputs.rnapp }} - expo55: ${{ steps.filter.outputs.expo55 }} expo56: ${{ steps.filter.outputs.expo56 }} + expo57: ${{ steps.filter.outputs.expo57 }} androidapp: ${{ steps.filter.outputs.androidapp }} appleapp: ${{ steps.filter.outputs.appleapp }} gradle-plugins: ${{ steps.filter.outputs.gradle-plugins }} @@ -42,12 +42,12 @@ jobs: rnapp: - 'apps/RNApp/**' - 'apps/brownfield-example-shared-tests/**' - expo55: - - 'apps/ExpoApp55/**' - - 'apps/brownfield-example-shared-tests/**' expo56: - 'apps/ExpoApp56/**' - 'apps/brownfield-example-shared-tests/**' + expo57: + - 'apps/ExpoApp57/**' + - 'apps/brownfield-example-shared-tests/**' androidapp: - 'apps/AndroidApp/**' appleapp: @@ -138,8 +138,8 @@ jobs: if: | always() && ( - needs.filter.outputs.expo55 == 'true' || needs.filter.outputs.expo56 == 'true' || + needs.filter.outputs.expo57 == 'true' || needs.filter.outputs.androidapp == 'true' || needs.filter.outputs.packages == 'true' || needs.filter.outputs.gradle-plugins == 'true' || @@ -149,8 +149,8 @@ jobs: strategy: matrix: include: - - version: '55' - version: '56' + - version: '57' steps: - name: Checkout @@ -224,8 +224,8 @@ jobs: if: | always() && ( - needs.filter.outputs.expo55 == 'true' || needs.filter.outputs.expo56 == 'true' || + needs.filter.outputs.expo57 == 'true' || needs.filter.outputs.appleapp == 'true' || needs.filter.outputs.packages == 'true' || needs.filter.outputs.ci == 'true' @@ -234,10 +234,10 @@ jobs: strategy: matrix: include: - - version: '55' - run-e2e: 'true' - version: '56' run-e2e: 'true' + - version: '57' + run-e2e: 'true' steps: - name: Checkout diff --git a/.yarn/patches/expo-updates-npm-55.0.21-990b55bddd.patch b/.yarn/patches/expo-updates-npm-55.0.21-990b55bddd.patch deleted file mode 100644 index bdecc78b..00000000 --- a/.yarn/patches/expo-updates-npm-55.0.21-990b55bddd.patch +++ /dev/null @@ -1,170 +0,0 @@ -diff --git a/android/build.gradle b/android/build.gradle -index 96acaf0f66e2e62252fb56b65db17f261e684773..0599b2a81494d2e5aa37cd1815a4d4506d99e2ae 100644 ---- a/android/build.gradle -+++ b/android/build.gradle -@@ -115,9 +115,6 @@ android { - unitTests.includeAndroidResources = true - - packagingOptions { -- pickFirst "**/libfbjni.so" -- pickFirst "**/libc++_shared.so" -- - resources.excludes.add("META-INF/LICENSE.md") - resources.excludes.add("META-INF/LICENSE-notice.md") - } -diff --git a/android/src/main/java/expo/modules/updates/UpdatesController.kt b/android/src/main/java/expo/modules/updates/UpdatesController.kt -index 9abf5b3bb92cda5bc4ab7501c35abe2bffeed59c..4ce541561208d8cd1ccaaf46f49211a5818a4015 100644 ---- a/android/src/main/java/expo/modules/updates/UpdatesController.kt -+++ b/android/src/main/java/expo/modules/updates/UpdatesController.kt -@@ -2,6 +2,7 @@ package expo.modules.updates - - import android.content.Context - import com.facebook.react.ReactApplication -+import com.facebook.react.ReactHost - import expo.modules.updates.events.IUpdatesEventManagerObserver - import expo.modules.updates.loader.LoaderTask - import expo.modules.updates.logging.UpdatesErrorCode -@@ -25,6 +26,19 @@ object UpdatesController { - @Volatile - private var overrideConfiguration: UpdatesConfiguration? = null - -+ @Volatile -+ private var reactHost: ReactHost? = null -+ -+ @JvmStatic -+ fun setReactHost(reactHost: ReactHost) { -+ this.reactHost = reactHost -+ } -+ -+ @JvmStatic -+ fun getReactHost(): ReactHost? { -+ return reactHost -+ } -+ - @JvmStatic - val instance: IUpdatesController - get() { -diff --git a/android/src/main/java/expo/modules/updates/UpdatesPackage.kt b/android/src/main/java/expo/modules/updates/UpdatesPackage.kt -index df17124d19bc734e32594237f7aff3085ea1573f..035d5be5e3189153d32a880ec48b8f45a0fb37d2 100644 ---- a/android/src/main/java/expo/modules/updates/UpdatesPackage.kt -+++ b/android/src/main/java/expo/modules/updates/UpdatesPackage.kt -@@ -49,6 +49,10 @@ class UpdatesPackage : Package { - override fun onReactInstanceException(useDeveloperSupport: Boolean, exception: Exception) { - UpdatesController.instance.onReactInstanceException(exception) - } -+ -+ override fun onDidCreateReactHost(context: Context, reactNativeHost: ReactHost) { -+ UpdatesController.setReactHost(reactNativeHost) -+ } - } - return listOf(handler) - } -diff --git a/android/src/main/java/expo/modules/updates/procedures/RecreateReactContextProcedure.kt b/android/src/main/java/expo/modules/updates/procedures/RecreateReactContextProcedure.kt -index 3bf9f207ae7d3c46151103d8f809821a9df20d56..1ccb4877c2fcefd2c63d43dcc59664c83932805f 100644 ---- a/android/src/main/java/expo/modules/updates/procedures/RecreateReactContextProcedure.kt -+++ b/android/src/main/java/expo/modules/updates/procedures/RecreateReactContextProcedure.kt -@@ -2,7 +2,6 @@ package expo.modules.updates.procedures - - import android.app.Activity - import android.content.Context --import com.facebook.react.ReactApplication - import expo.modules.updates.launcher.Launcher - import expo.modules.updates.statemachine.UpdatesStateEvent - import kotlinx.coroutines.CoroutineScope -@@ -20,16 +19,11 @@ class RecreateReactContextProcedure( - override val loggerTimerLabel = "timer-recreate-react-context" - - override suspend fun run(procedureContext: ProcedureContext) { -- val reactApplication = context.applicationContext as? ReactApplication ?: run inner@{ -- callback.onFailure(Exception("Could not reload application. Ensure you have passed the correct instance of ReactApplication into UpdatesController.initialize().")) -- return -- } -- - procedureContext.processStateEvent(UpdatesStateEvent.Restart()) - callback.onSuccess() - procedureScope.launch { - withContext(Dispatchers.Main) { -- reactApplication.restart(weakActivity?.get(), "Restart from RecreateReactContextProcedure") -+ RestartReactAppExtensions.restart(weakActivity?.get(), "Restart from RecreateReactContextProcedure") - } - } - procedureContext.resetStateAfterRestart() -diff --git a/android/src/main/java/expo/modules/updates/procedures/RelaunchProcedure.kt b/android/src/main/java/expo/modules/updates/procedures/RelaunchProcedure.kt -index 4cbb7670f0a1853f9ecc9a5e41d033884df793fb..6a74db0df9083635588534e88fb154cdc432c453 100644 ---- a/android/src/main/java/expo/modules/updates/procedures/RelaunchProcedure.kt -+++ b/android/src/main/java/expo/modules/updates/procedures/RelaunchProcedure.kt -@@ -2,7 +2,6 @@ package expo.modules.updates.procedures - - import android.app.Activity - import android.content.Context --import com.facebook.react.ReactApplication - import expo.modules.updates.UpdatesConfiguration - import expo.modules.updates.db.DatabaseHolder - import expo.modules.updates.db.Reaper -@@ -40,11 +39,6 @@ class RelaunchProcedure( - override val loggerTimerLabel = "timer-relaunch" - - override suspend fun run(procedureContext: ProcedureContext) { -- val reactApplication = context as? ReactApplication ?: run inner@{ -- callback.onFailure(Exception("Could not reload application. Ensure you have passed the correct instance of ReactApplication into UpdatesController.initialize().")) -- return -- } -- - procedureContext.processStateEvent(UpdatesStateEvent.Restart()) - - val newLauncher = DatabaseLauncher( -@@ -71,7 +65,7 @@ class RelaunchProcedure( - procedureScope.launch { - withContext(Dispatchers.Main) { - reloadScreenManager?.show(weakActivity?.get()) -- reactApplication.restart(weakActivity?.get(), "Restart from RelaunchProcedure") -+ RestartReactAppExtensions.restart(weakActivity?.get(), "Restart from RelaunchProcedure") - } - } - -diff --git a/android/src/main/java/expo/modules/updates/procedures/RestartReactAppExtensions.kt b/android/src/main/java/expo/modules/updates/procedures/RestartReactAppExtensions.kt -index 7392ca808be584f994a26f5b7294cd2d29f1fc8d..39dccdd3c2ee165653a94f8404f8a7489d51e4d2 100644 ---- a/android/src/main/java/expo/modules/updates/procedures/RestartReactAppExtensions.kt -+++ b/android/src/main/java/expo/modules/updates/procedures/RestartReactAppExtensions.kt -@@ -2,19 +2,29 @@ package expo.modules.updates.procedures - - import android.app.Activity - import com.facebook.react.ReactApplication -+import com.facebook.react.ReactHost - import com.facebook.react.common.LifecycleState -+import expo.modules.updates.UpdatesController - --/** -- * An extension for [ReactApplication] to restart the app -- * -- * @param activity For bridgeless mode if the ReactHost is destroyed, we need an Activity to resume it. -- * @param reason The restart reason. Only used on bridgeless mode. -- */ --internal fun ReactApplication.restart(activity: Activity?, reason: String) { -- val reactHost = this.reactHost -- check(reactHost != null) -- if (reactHost.lifecycleState != LifecycleState.RESUMED && activity != null) { -- reactHost.onHostResume(activity) -+private fun getReactHostReflectively(app: ReactApplication): ReactHost? { -+ return runCatching { -+ app.javaClass.getMethod("getReactHost").invoke(app) as? ReactHost -+ }.getOrNull() -+} -+ -+object RestartReactAppExtensions { -+ /** -+ * A function to restart the app -+ * -+ * @param activity For bridgeless mode if the ReactHost is destroyed, we need an Activity to resume it. -+ * @param reason The restart reason. Only used on bridgeless mode. -+ */ -+ internal fun restart(activity: Activity?, reason: String) { -+ val reactHost = UpdatesController.getReactHost() ?: getReactHostReflectively(activity?.application as ReactApplication) -+ check(reactHost != null) -+ if (reactHost.lifecycleState != LifecycleState.RESUMED && activity != null) { -+ reactHost.onHostResume(activity) -+ } -+ reactHost.reload(reason) - } -- reactHost.reload(reason) - } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f4ef036f..61b9619c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,7 +29,7 @@ We use [changesets](https://github.com/changesets/changesets) to make it easier - `lint` - runs linting on all JS/TS source files in the monorepo _[Turbo]_ - `gradle-plugin:lint` - runs linting on the Brownfield Gradle plugin source code - `typecheck` - runs TypeScript type checking on all TS source files in the monorepo _[Turbo]_ -- `test:apps` - runs Jest for the React Native example apps under `apps/` (Expo 55, plain RN) _[Turbo]_ +- `test:apps` - runs Jest for the React Native example apps under `apps/` (Expo 56, plain RN) _[Turbo]_ - `build` - runs all `build*` tasks in the Turbo repo - see below for more details _[Turbo]_ - `dev` - runs all `dev` tasks in all workspaces - `brownfield:plugin:publish:local` - publishes the Brownfield Gradle plugin to your local Maven repository for testing purposes @@ -37,10 +37,13 @@ We use [changesets](https://github.com/changesets/changesets) to make it easier - `build:docs` - builds the documentation site (`docs/`) _[Turbo]_ - `build:example:android-rn` - builds the example React Native app for Android (`apps/RNApp/android`) - `build:example:ios-rn` - builds the example React Native app for iOS (`apps/RNApp/ios`) -- `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 +- `build:example:android-consumer:expo56` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the Expo 56 RN app (`apps/ExpoApp56`) artifact +- `build:example:android-consumer:expo57` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the Expo 57 RN app (`apps/ExpoApp57`) artifact +- `build:example:android-consumer:expo` - alias for `build:example:android-consumer:expo57` - `build:example:android-consumer:vanilla` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the vanilla RN app (`apps/RNApp`) artifact -- `build:example:ios-consumer:expo` - alias for `build:example:ios-consumer:expo55` -- `build:example:ios-consumer:expo55` - builds the `Brownfield Apple App (ExpoApp55)` target via scheme **Brownfield Apple App Expo 55** (`Release`) +- `build:example:ios-consumer:expo` - alias for `build:example:ios-consumer:expo57` +- `build:example:ios-consumer:expo56` - builds the `Brownfield Apple App (ExpoApp56)` target via scheme **Brownfield Apple App Expo 56** (`Release`) +- `build:example:ios-consumer:expo57` - builds the `Brownfield Apple App (ExpoApp57)` target via scheme **Brownfield Apple App Expo 57** (`Release`) - `build:example:ios-consumer:vanilla` - builds the `Brownfield Apple App (RNApp)` target via scheme **Brownfield Apple App Vanilla** (`Release Vanilla`) ## Running demo apps @@ -60,21 +63,24 @@ To package an application for brownfield, you can run `yarn brownfield:package:i There are 2 brownfield host apps. > [!IMPORTANT] -> 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`. +> Each of the scripts below requires you to **first** package the consumed RN application with `yarn brownfield:package:ios`, e.g. `cd apps/ExpoApp56 && yarn brownfield:package:ios`. - `apps/AndroidApp` - for Android - - `build:example:android-consumer:expo55` - consumes Expo 55 + - `build:example:android-consumer:expo56` - consumes Expo 56 + - `build:example:android-consumer:expo57` (or `expo`) - consumes Expo 57 - `build:example:android-consumer:vanilla` - consumes the vanilla `RNApp` -- `apps/AppleApp` - for Apple (two Xcode targets, each with its own shared scheme) - - `build:example:ios-consumer:expo55` (or `expo`) — target `Brownfield Apple App (ExpoApp55)`, scheme **Brownfield Apple App Expo 55** +- `apps/AppleApp` - for Apple (one Xcode target per consumed RN app, each with its own shared scheme) + - `build:example:ios-consumer:expo56` — target `Brownfield Apple App (ExpoApp56)`, scheme **Brownfield Apple App Expo 56** + - `build:example:ios-consumer:expo57` (or `expo`) — target `Brownfield Apple App (ExpoApp57)`, scheme **Brownfield Apple App Expo 57** - `build:example:ios-consumer:vanilla` — target `Brownfield Apple App (RNApp)`, scheme **Brownfield Apple App Vanilla** -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`). +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/ExpoApp56`, or `apps/ExpoApp57`), 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`). | Yarn script | RN app | Xcode target | Scheme | Configuration | | ------------------------------------ | ----------- | ---------------------------------- | ---------------------------- | ----------------- | | `build:example:ios-consumer:vanilla` | `RNApp` | `Brownfield Apple App (RNApp)` | Brownfield Apple App Vanilla | `Release Vanilla` | -| `build:example:ios-consumer:expo55` | `ExpoApp55` | `Brownfield Apple App (ExpoApp55)` | Brownfield Apple App Expo 55 | `Release` | +| `build:example:ios-consumer:expo56` | `ExpoApp56` | `Brownfield Apple App (ExpoApp56)` | Brownfield Apple App Expo 56 | `Release` | +| `build:example:ios-consumer:expo57` | `ExpoApp57` | `Brownfield Apple App (ExpoApp57)` | Brownfield Apple App Expo 57 | `Release` | > [!IMPORTANT] > You can build and run `AppleApp` from the Xcode GUI by selecting the scheme for the variant you want. Before running, after switching schemes or re-packaging an RN app, run the matching `build:example:ios-consumer:...` script so fresh artifacts are present in `apps/AppleApp/package`. Otherwise Xcode will still link against the previous XCFrameworks. @@ -85,14 +91,17 @@ The local Swift Package Manager flow is separate from `prepareXCFrameworks.js`. 1. Package the producer app with `--add-spm-package`, for example: - `cd apps/RNApp && yarn exec brownfield package:ios --scheme BrownfieldLib --configuration Release --add-spm-package` - - `cd apps/ExpoApp55 && yarn exec brownfield package:ios --scheme BrownfieldLib --configuration Release --add-spm-package` + - `cd apps/ExpoApp56 && yarn exec brownfield package:ios --scheme BrownfieldLib --configuration Release --add-spm-package` + - `cd apps/ExpoApp57 && yarn exec brownfield package:ios --scheme BrownfieldLib --configuration Release --add-spm-package` 2. Open `apps/AppleApp/Brownfield Apple App.xcodeproj`. 3. Select the host scheme you want to validate: - `Brownfield Apple App Vanilla` - - `Brownfield Apple App Expo 55` + - `Brownfield Apple App Expo 56` + - `Brownfield Apple App Expo 57` 4. In Xcode, go to `Package Dependencies`, click `+`, choose `Add Local...`, and select the generated package folder: - `apps/RNApp/ios/.brownfield/package/build` - - `apps/ExpoApp55/ios/.brownfield/package/build` + - `apps/ExpoApp56/ios/.brownfield/package/build` + - `apps/ExpoApp57/ios/.brownfield/package/build` 5. Add the `BrownfieldLib` product to the matching AppleApp target. 6. Remove old direct `package/*.xcframework` references from that target if you are switching from the legacy direct-XCFramework path. @@ -113,9 +122,9 @@ Per example app (run from the repo root): | Command | App | | --------------------------------------------------------------- | --------------------------------- | | `yarn workspace @callstack/brownfield-example-rn-app test` | Plain React Native (`apps/RNApp`) | -| `yarn workspace @callstack/brownfield-example-expo-app-55 test` | Expo SDK 55 (`apps/ExpoApp55`) | +| `yarn workspace @callstack/brownfield-example-expo-app-56 test` | Expo SDK 56 (`apps/ExpoApp56`) | -Package-level scripts (`yarn test` inside `apps/RNApp` or `apps/ExpoApp55`) invoke Jest with each app’s `jest.config.js`. +Package-level scripts (`yarn test` inside `apps/RNApp` or `apps/ExpoApp56`) invoke Jest with each app’s `jest.config.js`. The native-only sample apps (`apps/AppleApp`, `apps/AndroidApp`) use their platform test runners (Xcode / Gradle), not Jest. @@ -129,7 +138,7 @@ E2E runs without Metro: the Debug simulator build embeds `main.jsbundle` (`FORCE | Path | What it exercises | Typical flow | | ----------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | -| RN host app (`RNApp`, `ExpoApp55`) | Brownfield RN app running as the simulator target | `expo prebuild` / pods → Detox build → Detox test | +| RN host app (`RNApp`) | Brownfield RN app running as the simulator target | pods → Detox build → Detox test | | native host app (`AppleApp`) | Native host app consuming a packaged `BrownfieldLib` XCFramework | `brownfield:package:ios` → copy XCFrameworks into `AppleApp/package` → Detox build → Detox test | Per-app Detox scripts (run from the app directory): @@ -137,9 +146,9 @@ Per-app Detox scripts (run from the app directory): | App | Build | Test | Shared spec | | ------------------------- | --------------------------- | -------------------------- | ---------------------------------- | | `RNApp` | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `rnAppBrownfield.e2e.js` | -| `ExpoApp55` | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `expoPostMessageBrownfield.e2e.js` | | `AppleApp` (vanilla) | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `appleAppBrownfield.e2e.js` | -| `AppleApp` (Expo 55) | `yarn e2e:build:ios:expo55` | `yarn e2e:test:ios:expo55` | `appleAppExpoBrownfield.e2e.js` | +| `AppleApp` (Expo 56) | `yarn e2e:build:ios:expo56` | `yarn e2e:test:ios:expo56` | `appleAppExpoBrownfield.e2e.js` | +| `AppleApp` (Expo 57) | `yarn e2e:build:ios:expo57` | `yarn e2e:test:ios:expo57` | `appleAppExpoBrownfield.e2e.js` | ### CI @@ -148,7 +157,8 @@ iOS Detox E2E runs in [`.github/workflows/ci.yml`](.github/workflows/ci.yml) via | Job | E2E | Notes | | ----------------------------- | --- | ---------------------------------------- | | `ios-appleapp-vanilla` | Yes | `RNApp` → package → `AppleApp` Detox | -| `ios-appleapp-expo` (Expo 55) | Yes | `ExpoApp55` → package → `AppleApp` Detox | +| `ios-appleapp-expo` (Expo 56) | Yes | `ExpoApp56` → package → `AppleApp` Detox | +| `ios-appleapp-expo` (Expo 57) | Yes | `ExpoApp57` → package → `AppleApp` Detox | On failure, CI uploads `apps/AppleApp/e2e-artifacts/` as a workflow artifact (`detox-appleapp-*-ios-recordings`). @@ -158,12 +168,14 @@ Direct host-app E2E is local-only — use the `ci:local:*` scripts below to repr From the repo root (macOS + Xcode + Simulator required). All wrap `scripts/ci-local-ios-e2e-common.sh` and accept the same flags: -| Command | Mirrors | -| --------------------------------------- | -------------------------------- | -| `yarn ci:local:rnapp:e2e:ios` | RN host app E2E (`apps/RNApp`) | -| `yarn ci:local:expo55:e2e:ios` | Expo 55 host app E2E | -| `yarn ci:local:appleapp:e2e:ios` | CI `ios-appleapp-vanilla` | -| `yarn ci:local:appleapp:e2e:ios:expo55` | CI `ios-appleapp-expo` (Expo 55) | +| Command | Mirrors | +| ---------------------------------------------------- | -------------------------------- | +| `yarn ci:local:rnapp:e2e:ios` | RN host app E2E (`apps/RNApp`) | +| `yarn ci:local:appleapp:e2e:ios` | CI `ios-appleapp-vanilla` | +| `yarn ci:local:appleapp:e2e:ios --variant expo56` | CI `ios-appleapp-expo` (Expo 56) | +| `yarn ci:local:appleapp:e2e:ios --variant expo57` | CI `ios-appleapp-expo` (Expo 57) | + +From `apps/AppleApp`, you can also use `yarn ci:local:e2e:ios:expo56` / `yarn ci:local:e2e:ios:expo57`. Common flags (append to any command above): diff --git a/apps/AndroidApp/app/build.gradle.kts b/apps/AndroidApp/app/build.gradle.kts index fc835136..e31b597f 100644 --- a/apps/AndroidApp/app/build.gradle.kts +++ b/apps/AndroidApp/app/build.gradle.kts @@ -30,9 +30,6 @@ android { flavorDimensions += "app" productFlavors { - create("expo55") { - dimension = "app" - } create("expo57") { dimension = "app" } @@ -79,7 +76,6 @@ dependencies { implementation(libs.androidx.compose.material3) implementation(libs.androidx.appcompat) add("expo57Implementation", libs.brownfieldlib.expo57) - add("expo55Implementation", libs.brownfieldlib.expo55) add("expo56Implementation", libs.brownfieldlib.expo56) add("expobetaImplementation", libs.brownfieldlib.expobeta) add("vanillaImplementation", libs.brownfieldlib.vanilla) diff --git a/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt b/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt deleted file mode 100644 index 2dae42ba..00000000 --- a/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.callstack.brownfield.android.example - -typealias BrownfieldStore = com.callstack.rnbrownfield.demo.expoapp55.BrownfieldStore -typealias User = com.callstack.rnbrownfield.demo.expoapp55.User diff --git a/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt b/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt deleted file mode 100644 index ee7e89bf..00000000 --- a/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.callstack.brownfield.android.example - -object ReactNativeConstants { - const val MAIN_MODULE_NAME = "main" - const val APP_NAME = "Android (Expo 55)" -} diff --git a/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt b/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt deleted file mode 100644 index be934b7a..00000000 --- a/apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.callstack.brownfield.android.example - -typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.expoapp55.ReactNativeHostManager diff --git a/apps/AndroidApp/gradle/libs.versions.toml b/apps/AndroidApp/gradle/libs.versions.toml index 4766d46f..d9f05be2 100644 --- a/apps/AndroidApp/gradle/libs.versions.toml +++ b/apps/AndroidApp/gradle/libs.versions.toml @@ -18,7 +18,6 @@ gson = "2.13.2" androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } brownfieldlib-expo57 = { module = "com.callstack.rnbrownfield.demo.expoapp57:brownfieldlib", version.ref = "brownfieldlib" } 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-vanilla = { module = "com.rnapp:brownfieldlib", version.ref = "brownfieldlib" } junit = { group = "junit", name = "junit", version.ref = "junit" } diff --git a/apps/AndroidApp/package.json b/apps/AndroidApp/package.json index 960fe394..6449596b 100644 --- a/apps/AndroidApp/package.json +++ b/apps/AndroidApp/package.json @@ -6,7 +6,6 @@ "build:example:android-consumer:expo": "./gradlew assembleExpo57Release", "build:example:android-consumer:expo57": "./gradlew assembleExpo57Release", "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:vanilla": "./gradlew assembleVanillaRelease" } diff --git a/apps/AppleApp/.detoxrc.expo55.cjs b/apps/AppleApp/.detoxrc.expo57.cjs similarity index 83% rename from apps/AppleApp/.detoxrc.expo55.cjs rename to apps/AppleApp/.detoxrc.expo57.cjs index 6193df8d..26dfd166 100644 --- a/apps/AppleApp/.detoxrc.expo55.cjs +++ b/apps/AppleApp/.detoxrc.expo57.cjs @@ -5,7 +5,7 @@ const { getAppleAppDetoxVariant, } = require('../brownfield-example-shared-tests/detox-appleapp-variants.cjs'); -const variant = getAppleAppDetoxVariant('expo55'); +const variant = getAppleAppDetoxVariant('expo57'); /** @type {import('detox').DetoxConfig} */ module.exports = createAppleAppIosSimDebugDetoxConfig({ @@ -13,5 +13,5 @@ module.exports = createAppleAppIosSimDebugDetoxConfig({ configuration: variant.configuration, appBinaryName: variant.appBinaryName, detoxConfiguration: variant.detoxConfiguration, - jestConfigPath: 'e2e/jest.config.expo55.cjs', + jestConfigPath: 'e2e/jest.config.expo57.cjs', }); diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj index 502e3e25..286526cf 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj @@ -79,20 +79,6 @@ 7953277C2FB4A909008398F3 /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7953277D2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; 7953277E2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE862FB7273600B94C6F /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; - 79B8BE872FB7273600B94C6F /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; - 79B8BE882FB7273600B94C6F /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; - 79B8BE892FB7273600B94C6F /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; }; - 79B8BE8A2FB7273600B94C6F /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; }; - 79B8BE8B2FB7273600B94C6F /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; }; - 79B8BE8C2FB7273600B94C6F /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; }; - 79B8BE8F2FB7273600B94C6F /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE902FB7273600B94C6F /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE912FB7273600B94C6F /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE922FB7273600B94C6F /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE932FB7273600B94C6F /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE942FB7273600B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE952FB7273600B94C6F /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 79B8BEA02FB8000000B94C6F /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; 79B8BEA12FB8000000B94C6F /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; 79B8BEA22FB8000000B94C6F /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; @@ -169,23 +155,6 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 79B8BE8E2FB7273600B94C6F /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 79B8BE8F2FB7273600B94C6F /* Brownie.xcframework in Embed Frameworks */, - 79B8BE902FB7273600B94C6F /* ReactBrownfield.xcframework in Embed Frameworks */, - 79B8BE912FB7273600B94C6F /* ReactNativeDependencies.xcframework in Embed Frameworks */, - 79B8BE922FB7273600B94C6F /* BrownfieldNavigation.xcframework in Embed Frameworks */, - 79B8BE932FB7273600B94C6F /* hermesvm.xcframework in Embed Frameworks */, - 79B8BE942FB7273600B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */, - 79B8BE952FB7273600B94C6F /* React.xcframework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; 79B8BEAE2FB8000000B94C6F /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -259,7 +228,6 @@ 79B1D99D2FB4A61400A5F42B /* React.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = React.xcframework; path = package/React.xcframework; sourceTree = ""; }; 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ReactBrownfield.xcframework; path = package/ReactBrownfield.xcframework; sourceTree = ""; }; 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ReactNativeDependencies.xcframework; path = package/ReactNativeDependencies.xcframework; sourceTree = ""; }; - 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoApp55).app"; sourceTree = BUILT_PRODUCTS_DIR; }; 79B8BEB22FB8000000B94C6F /* Brownfield Apple App (ExpoApp56).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoApp56).app"; sourceTree = BUILT_PRODUCTS_DIR; }; 7A1B2C3D4E5F60718293A202 /* Brownfield Apple App (ExpoAppBeta).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoAppBeta).app"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -333,20 +301,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 79B8BE852FB7273600B94C6F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 79B8BE862FB7273600B94C6F /* Brownie.xcframework in Frameworks */, - 79B8BE872FB7273600B94C6F /* BrownfieldNavigation.xcframework in Frameworks */, - 79B8BE882FB7273600B94C6F /* ReactNativeDependencies.xcframework in Frameworks */, - 79B8BE892FB7273600B94C6F /* hermesvm.xcframework in Frameworks */, - 79B8BE8A2FB7273600B94C6F /* ReactBrownfield.xcframework in Frameworks */, - 79B8BE8B2FB7273600B94C6F /* BrownfieldLib.xcframework in Frameworks */, - 79B8BE8C2FB7273600B94C6F /* React.xcframework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 79B8BEAF2FB8000000B94C6F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -432,7 +386,6 @@ isa = PBXGroup; children = ( 793C76A72EEBF938008A2A34 /* Brownfield Apple App (RNApp).app */, - 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */, 79B8BEB22FB8000000B94C6F /* Brownfield Apple App (ExpoApp56).app */, 7A1B2C3D4E5F60718293A202 /* Brownfield Apple App (ExpoAppBeta).app */, 617FBE3E2FF7AA9D00348DD8 /* Brownfield Apple App (ExpoApp57).app */, @@ -489,29 +442,6 @@ productReference = 793C76A72EEBF938008A2A34 /* Brownfield Apple App (RNApp).app */; productType = "com.apple.product-type.application"; }; - 79B8BE832FB7273600B94C6F /* Brownfield Apple App (ExpoApp55) */ = { - isa = PBXNativeTarget; - buildConfigurationList = 79B8BE962FB7273600B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp55)" */; - buildPhases = ( - 79B8BE842FB7273600B94C6F /* Sources */, - 79B8BE852FB7273600B94C6F /* Frameworks */, - 79B8BE8D2FB7273600B94C6F /* Resources */, - 79B8BE8E2FB7273600B94C6F /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - fileSystemSynchronizedGroups = ( - 793C76A92EEBF938008A2A34 /* Brownfield Apple App */, - ); - name = "Brownfield Apple App (ExpoApp55)"; - packageProductDependencies = ( - ); - productName = "Brownfield Apple App"; - productReference = 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */; - productType = "com.apple.product-type.application"; - }; 79B8BEB42FB8000000B94C6F /* Brownfield Apple App (ExpoApp56) */ = { isa = PBXNativeTarget; buildConfigurationList = 79B8BEB92FB8000000B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp56)" */; @@ -596,7 +526,6 @@ projectRoot = ""; targets = ( 793C76A62EEBF938008A2A34 /* Brownfield Apple App (RNApp) */, - 79B8BE832FB7273600B94C6F /* Brownfield Apple App (ExpoApp55) */, 79B8BEB42FB8000000B94C6F /* Brownfield Apple App (ExpoApp56) */, 617FBE102FF7AA9D00348DD8 /* Brownfield Apple App (ExpoApp57) */, 7A1B2C3D4E5F60718293A301 /* Brownfield Apple App (ExpoAppBeta) */, @@ -619,13 +548,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 79B8BE8D2FB7273600B94C6F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 79B8BEB02FB8000000B94C6F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -657,13 +579,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 79B8BE842FB7273600B94C6F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 79B8BEB12FB8000000B94C6F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1081,194 +996,6 @@ }; name = "Release Expo"; }; - 79B8BE972FB7273600B94C6F /* Debug Expo */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - ENABLE_APP_SANDBOX = YES; - ENABLE_PREVIEWS = YES; - ENABLE_USER_SELECTED_FILES = readonly; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; - "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; - "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; - "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; - PRODUCT_NAME = "$(TARGET_NAME)"; - REGISTER_APP_GROUPS = YES; - SDKROOT = auto; - STRING_CATALOG_GENERATE_SYMBOLS = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) USE_EXPO_HOST"; - SWIFT_APPROACHABLE_CONCURRENCY = YES; - SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2,7"; - USE_EXPO_HOST_STATUS_BAR_APPEARANCE = NO; - XROS_DEPLOYMENT_TARGET = 2.0; - }; - name = "Debug Expo"; - }; - 79B8BE982FB7273600B94C6F /* Release Expo */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - ENABLE_APP_SANDBOX = YES; - ENABLE_PREVIEWS = YES; - ENABLE_USER_SELECTED_FILES = readonly; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; - "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; - "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; - "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; - PRODUCT_NAME = "$(TARGET_NAME)"; - REGISTER_APP_GROUPS = YES; - SDKROOT = auto; - STRING_CATALOG_GENERATE_SYMBOLS = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) USE_EXPO_HOST"; - SWIFT_APPROACHABLE_CONCURRENCY = YES; - SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2,7"; - USE_EXPO_HOST_STATUS_BAR_APPEARANCE = NO; - XROS_DEPLOYMENT_TARGET = 2.0; - }; - name = "Release Expo"; - }; - 79B8BE992FB7273600B94C6F /* Debug Vanilla */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - ENABLE_APP_SANDBOX = YES; - ENABLE_PREVIEWS = YES; - ENABLE_USER_SELECTED_FILES = readonly; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; - "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; - "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; - "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; - PRODUCT_NAME = "$(TARGET_NAME)"; - REGISTER_APP_GROUPS = YES; - SDKROOT = auto; - STRING_CATALOG_GENERATE_SYMBOLS = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; - SWIFT_APPROACHABLE_CONCURRENCY = YES; - SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2,7"; - USE_EXPO_HOST_STATUS_BAR_APPEARANCE = YES; - XROS_DEPLOYMENT_TARGET = 2.0; - }; - name = "Debug Vanilla"; - }; - 79B8BE9A2FB7273600B94C6F /* Release Vanilla */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - ENABLE_APP_SANDBOX = YES; - ENABLE_PREVIEWS = YES; - ENABLE_USER_SELECTED_FILES = readonly; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; - "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; - "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; - "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; - "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; - "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; - PRODUCT_NAME = "$(TARGET_NAME)"; - REGISTER_APP_GROUPS = YES; - SDKROOT = auto; - STRING_CATALOG_GENERATE_SYMBOLS = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; - SWIFT_APPROACHABLE_CONCURRENCY = YES; - SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2,7"; - USE_EXPO_HOST_STATUS_BAR_APPEARANCE = YES; - XROS_DEPLOYMENT_TARGET = 2.0; - }; - name = "Release Vanilla"; - }; 79B8BEB52FB8000000B94C6F /* Debug Expo */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1893,17 +1620,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = "Release Expo"; }; - 79B8BE962FB7273600B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp55)" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 79B8BE972FB7273600B94C6F /* Debug Expo */, - 79B8BE982FB7273600B94C6F /* Release Expo */, - 79B8BE992FB7273600B94C6F /* Debug Vanilla */, - 79B8BE9A2FB7273600B94C6F /* Release Vanilla */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = "Release Expo"; - }; 79B8BEB92FB8000000B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp56)" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 55.xcscheme b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 55.xcscheme deleted file mode 100644 index cf36ecc1..00000000 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 55.xcscheme +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist index a2ffa45e..9d4a0a4a 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist @@ -4,15 +4,15 @@ SchemeUserState - Brownfield Apple App Expo 55.xcscheme + Brownfield Apple App Expo 56.xcscheme orderHint - 1 + 0 - Brownfield Apple App Expo 56.xcscheme + Brownfield Apple App Expo 57.xcscheme orderHint - 0 + 1 Brownfield Apple App Vanilla.xcscheme @@ -27,17 +27,12 @@ primary - 79B8BE682FB7270E00B94C6F - - primary - - - 79B8BE832FB7273600B94C6F + 79B8BEB42FB8000000B94C6F primary - 79B8BEB42FB8000000B94C6F + 617FBE102FF7AA9D00348DD8 primary diff --git a/apps/AppleApp/e2e/jest.config.expo55.cjs b/apps/AppleApp/e2e/jest.config.expo57.cjs similarity index 90% rename from apps/AppleApp/e2e/jest.config.expo55.cjs rename to apps/AppleApp/e2e/jest.config.expo57.cjs index 78cbd4e9..bbba9cc8 100644 --- a/apps/AppleApp/e2e/jest.config.expo55.cjs +++ b/apps/AppleApp/e2e/jest.config.expo57.cjs @@ -6,7 +6,7 @@ const { getAppleAppDetoxVariant, } = require('../../brownfield-example-shared-tests/detox-appleapp-variants.cjs'); -const variant = getAppleAppDetoxVariant('expo55'); +const variant = getAppleAppDetoxVariant('expo57'); module.exports = createDetoxJestConfig({ e2eDir: __dirname, diff --git a/apps/AppleApp/package.json b/apps/AppleApp/package.json index 74b64618..f1bc7872 100644 --- a/apps/AppleApp/package.json +++ b/apps/AppleApp/package.json @@ -7,19 +7,18 @@ "build:example:ios-consumer:expo": "yarn build:example:ios-consumer:expo57", "build:example:ios-consumer:expo57": "node prepareXCFrameworks.js --appName ExpoApp57 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 57\" -configuration Release", "build:example:ios-consumer:expo56": "node prepareXCFrameworks.js --appName ExpoApp56 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 56\" -configuration Release", - "build:example:ios-consumer:expo55": "node prepareXCFrameworks.js --appName ExpoApp55 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 55\" -configuration Release", "build:example:ios-consumer:expobeta": "node prepareXCFrameworks.js --appName ExpoAppBeta && yarn internal::build::common -scheme \"Brownfield Apple App Expo Beta\" -configuration Release", "build:example:ios-consumer:vanilla": "node prepareXCFrameworks.js --appName RNApp && yarn internal::build::common -scheme \"Brownfield Apple App Vanilla\" -configuration \"Release Vanilla\"", "internal::build::common": "xcodebuild -project \"Brownfield Apple App.xcodeproj\" -sdk iphonesimulator build CODE_SIGNING_ALLOWED=NO -derivedDataPath ./build", "e2e:build:ios": "detox build --configuration ios.sim.debug", "e2e:test:ios": "detox test --configuration ios.sim.debug", - "e2e:build:ios:expo55": "detox build --config-path .detoxrc.expo55.cjs --configuration ios.sim.debug.expo55", - "e2e:test:ios:expo55": "detox test --config-path .detoxrc.expo55.cjs --configuration ios.sim.debug.expo55", "e2e:build:ios:expo56": "detox build --config-path .detoxrc.expo56.cjs --configuration ios.sim.debug.expo56", "e2e:test:ios:expo56": "detox test --config-path .detoxrc.expo56.cjs --configuration ios.sim.debug.expo56", + "e2e:build:ios:expo57": "detox build --config-path .detoxrc.expo57.cjs --configuration ios.sim.debug.expo57", + "e2e:test:ios:expo57": "detox test --config-path .detoxrc.expo57.cjs --configuration ios.sim.debug.expo57", "ci:local:e2e:ios": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh", - "ci:local:e2e:ios:expo55": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh --variant expo55", - "ci:local:e2e:ios:expo56": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh --variant expo56" + "ci:local:e2e:ios:expo56": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh --variant expo56", + "ci:local:e2e:ios:expo57": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh --variant expo57" }, "devDependencies": { "@callstack/brownfield-example-shared-tests": "workspace:^", diff --git a/apps/ExpoApp55/.detoxrc.cjs b/apps/ExpoApp55/.detoxrc.cjs deleted file mode 100644 index 079382a9..00000000 --- a/apps/ExpoApp55/.detoxrc.cjs +++ /dev/null @@ -1,13 +0,0 @@ -const { - createIosSimDebugDetoxConfig, -} = require('../brownfield-example-shared-tests/detox-rc-ios-sim-debug.cjs'); - -/** - * Requires a native tree from `expo prebuild` / `expo run:ios` (ios/ + Pods). - * @type {import('detox').DetoxConfig} - */ -module.exports = createIosSimDebugDetoxConfig({ - workspace: 'ExpoApp55', - scheme: 'ExpoApp55', - appBinaryName: 'ExpoApp55', -}); diff --git a/apps/ExpoApp55/.gitignore b/apps/ExpoApp55/.gitignore deleted file mode 100644 index 17f9a695..00000000 --- a/apps/ExpoApp55/.gitignore +++ /dev/null @@ -1,46 +0,0 @@ -# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files - -# dependencies -node_modules/ - -# Expo -.expo/ -dist/ -web-build/ -expo-env.d.ts - -# Native -.kotlin/ -*.orig.* -*.jks -*.p8 -*.p12 -*.key -*.mobileprovision - -# Metro -.metro-health-check* - -# debug -npm-debug.* -yarn-debug.* -yarn-error.* - -# macOS -.DS_Store -*.pem - -# local env files -.env*.local - -# typescript -*.tsbuildinfo - -app-example - -# Detox -e2e-artifacts/ - -# generated native folders -/ios -/android diff --git a/apps/ExpoApp55/BrownfieldStore.brownie.ts b/apps/ExpoApp55/BrownfieldStore.brownie.ts deleted file mode 100644 index 94e22c72..00000000 --- a/apps/ExpoApp55/BrownfieldStore.brownie.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { BrownieStore } from '@callstack/brownie'; - -export interface BrownfieldStore extends BrownieStore { - counter: number; - user: { - name: string; - }; -} - -export interface SettingsStore extends BrownieStore { - theme: 'light' | 'dark'; - notificationsEnabled: boolean; - privacyMode: boolean; -} - -declare module '@callstack/brownie' { - interface BrownieStores { - BrownfieldStore: BrownfieldStore; - SettingsStore: SettingsStore; - } -} diff --git a/apps/ExpoApp55/README.md b/apps/ExpoApp55/README.md deleted file mode 100644 index 48dd63ff..00000000 --- a/apps/ExpoApp55/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Welcome to your Expo app 👋 - -This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app). - -## Get started - -1. Install dependencies - - ```bash - npm install - ``` - -2. Start the app - - ```bash - npx expo start - ``` - -In the output, you'll find options to open the app in a - -- [development build](https://docs.expo.dev/develop/development-builds/introduction/) -- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/) -- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/) -- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo - -You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction). - -## Get a fresh project - -When you're ready, run: - -```bash -npm run reset-project -``` - -This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing. - -## Learn more - -To learn more about developing your project with Expo, look at the following resources: - -- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides). -- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web. - -## Join the community - -Join our community of developers creating universal apps. - -- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute. -- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions. diff --git a/apps/ExpoApp55/RNApp.tsx b/apps/ExpoApp55/RNApp.tsx deleted file mode 100644 index e8a29731..00000000 --- a/apps/ExpoApp55/RNApp.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Button, StyleSheet, Text, View } from 'react-native'; -import { useEffect } from 'react'; -import BrownfieldNavigation from '@callstack/brownfield-navigation'; -import { - syncBrownfieldE2EModeFromRootProps, - type BrownfieldRootProps, -} from '@callstack/brownfield-example-shared-tests/runtime'; -import { checkAndFetchUpdate } from './src/utils/expo-rn-updates'; - -import Counter from './src/components/counter'; - -type RNAppProps = BrownfieldRootProps; - -export default function RNApp({ - nativeOsVersionLabel, - brownfieldE2E, -}: RNAppProps) { - useEffect(() => { - syncBrownfieldE2EModeFromRootProps(brownfieldE2E); - return () => syncBrownfieldE2EModeFromRootProps(undefined); - }, [brownfieldE2E]); - - return ( - - Expo React Native Brownfield - - {nativeOsVersionLabel ? ( - - {nativeOsVersionLabel} - - ) : null} - - - - -