diff --git a/.changeset/navigation-codegen-blank-line.md b/.changeset/navigation-codegen-blank-line.md new file mode 100644 index 000000000..e16c385d6 --- /dev/null +++ b/.changeset/navigation-codegen-blank-line.md @@ -0,0 +1,5 @@ +--- +'@callstack/brownfield-cli': patch +--- + +The navigation codegen no longer adds an extra blank line after the imports in the generated `index.ts`, which made the file fail Prettier. diff --git a/.github/actions/androidapp-road-test/action.yml b/.github/actions/androidapp-road-test/action.yml index dc9cc8cff..e30079309 100644 --- a/.github/actions/androidapp-road-test/action.yml +++ b/.github/actions/androidapp-road-test/action.yml @@ -3,7 +3,7 @@ description: Package the given RN app as AAR, publish to Maven Local, build the inputs: flavor: - description: 'AndroidApp flavor to build (expo or vanilla)' + description: 'AndroidApp flavor to build (expo, vanilla or rock)' required: true rn-project-path: diff --git a/.github/actions/appleapp-road-test/action.yml b/.github/actions/appleapp-road-test/action.yml index b9e579835..ca79212c7 100644 --- a/.github/actions/appleapp-road-test/action.yml +++ b/.github/actions/appleapp-road-test/action.yml @@ -3,7 +3,7 @@ description: Package the given RN app as XCFramework, build the corresponding Ap inputs: variant: - description: 'AppleApp yarn command variant to run (vanilla or expo)' + description: 'AppleApp yarn command variant to run (vanilla, expo or rock)' required: true rn-project-path: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2773da4a1..00eb1eddc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,6 +22,7 @@ jobs: outputs: packages: ${{ steps.filter.outputs.packages }} rnapp: ${{ steps.filter.outputs.rnapp }} + rockapp: ${{ steps.filter.outputs.rockapp }} expo58: ${{ steps.filter.outputs.expo58 }} expo57: ${{ steps.filter.outputs.expo57 }} androidapp: ${{ steps.filter.outputs.androidapp }} @@ -42,6 +43,11 @@ jobs: - 'packages/**' rnapp: - 'apps/RNApp/**' + - 'apps/brownfield-example-shared/**' + - 'apps/brownfield-example-shared-tests/**' + rockapp: + - 'apps/RockApp/**' + - 'apps/brownfield-example-shared/**' - 'apps/brownfield-example-shared-tests/**' expo58: - 'apps/ExpoApp58/**' @@ -98,6 +104,9 @@ jobs: - name: Build packages run: yarn build + - name: Generate Brownfield Navigation bindings + run: yarn workspace @callstack/brownfield-example-shared codegen:navigation + - name: Lint files run: yarn lint @@ -292,6 +301,33 @@ jobs: e2e-apk-artifact-name: androidapp-expo57-e2e-apks e2e-artifact-name: detox-androidapp-expo57 + android-androidapp-rock: + name: Android road test (RockApp & AndroidApp - Rock) + runs-on: ubuntu-latest + timeout-minutes: 120 + needs: [filter, build-lint] + if: | + always() && + ( + needs.filter.outputs.rockapp == 'true' || + needs.filter.outputs.androidapp == 'true' || + needs.filter.outputs.packages == 'true' || + needs.filter.outputs.gradle-plugins == 'true' || + needs.filter.outputs.ci == 'true' + ) && + (needs.build-lint.result == 'success' || needs.build-lint.result == 'skipped') + + steps: + - name: Checkout + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + + - name: Run RockApp -> AndroidApp road test (Rock) + uses: ./.github/actions/androidapp-road-test + with: + flavor: rock + rn-project-path: apps/RockApp + rn-project-maven-path: com/callstack/rnbrownfield/demo/rockapp/brownfieldlib + android-androidapp-vanilla: name: Android road test & E2E (AndroidApp - Vanilla) runs-on: ubuntu-latest @@ -382,3 +418,28 @@ jobs: rn-project-path: apps/ExpoApp${{ matrix.version }} run-e2e: ${{ matrix.run-e2e }} e2e-artifact-name: detox-appleapp-expo${{ matrix.version }} + + ios-appleapp-rock: + name: iOS road test (RockApp & AppleApp - Rock) + runs-on: macos-26 + timeout-minutes: 60 + needs: [filter, build-lint] + if: | + always() && + ( + needs.filter.outputs.rockapp == 'true' || + needs.filter.outputs.appleapp == 'true' || + needs.filter.outputs.packages == 'true' || + needs.filter.outputs.ci == 'true' + ) && + (needs.build-lint.result == 'success' || needs.build-lint.result == 'skipped') + + steps: + - name: Checkout + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + + - name: Run RockApp -> AppleApp road test (Rock) + uses: ./.github/actions/appleapp-road-test + with: + variant: rock + rn-project-path: apps/RockApp diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aaa719fc0..c7babfd1c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -186,6 +186,7 @@ These live in a workspace, not in the root `package.json`. Run them with `yarn w `apps/AndroidApp` (`@callstack/brownfield-example-android-app`), one Gradle flavor per consumed RN app: - `build:example:android-consumer:vanilla` - consumes `apps/RNApp` (`assembleVanillaRelease`) +- `build:example:android-consumer:rock` - consumes `apps/RockApp` (`assembleRockRelease`) - `build:example:android-consumer:expo58` - consumes `apps/ExpoApp58` (`assembleExpo58Release`) - `build:example:android-consumer:expo57` - consumes `apps/ExpoApp57` (`assembleExpo57Release`) - `build:example:android-consumer:expo` - alias for `build:example:android-consumer:expo57` @@ -194,6 +195,7 @@ These live in a workspace, not in the root `package.json`. Run them with `yarn w `apps/AppleApp` (`@callstack/brownfield-example-ios-app`), each copies the XCFrameworks with `prepareXCFrameworks.js` and runs `xcodebuild`: - `build:example:ios-consumer:vanilla` - consumes `RNApp`, scheme **Brownfield Apple App Vanilla** (`Release Vanilla`) +- `build:example:ios-consumer:rock` - consumes `RockApp`, scheme **Brownfield Apple App Rock** (`Release Rock`) - `build:example:ios-consumer:expo58` - consumes `ExpoApp58`, scheme **Brownfield Apple App Expo 58** (`Release`) - `build:example:ios-consumer:expo57` - consumes `ExpoApp57`, scheme **Brownfield Apple App Expo 57** (`Release`) - `build:example:ios-consumer:expo` - alias for `build:example:ios-consumer:expo57` @@ -226,16 +228,19 @@ There are 2 brownfield host apps. - `build:example:android-consumer:expo58` - consumes Expo 58 - `build:example:android-consumer:expo57` (or `expo`) - consumes Expo 57 - `build:example:android-consumer:vanilla` - consumes the vanilla `RNApp` + - `build:example:android-consumer:rock` - consumes `RockApp` - `apps/AppleApp` - for Apple (one Xcode target per consumed RN app, each with its own shared scheme) - `build:example:ios-consumer:expo58` — target `Brownfield Apple App (ExpoApp58)`, scheme **Brownfield Apple App Expo 58** - `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** + - `build:example:ios-consumer:rock` — target `Brownfield Apple App (RNApp)`, scheme **Brownfield Apple App Rock** -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/ExpoApp58`, 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`). +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/RockApp`, `apps/ExpoApp58`, 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:rock` | `RockApp` | `Brownfield Apple App (RNApp)` | Brownfield Apple App Rock | `Release Rock` | | `build:example:ios-consumer:expo58` | `ExpoApp58` | `Brownfield Apple App (ExpoApp58)` | Brownfield Apple App Expo 58 | `Release` | | `build:example:ios-consumer:expo57` | `ExpoApp57` | `Brownfield Apple App (ExpoApp57)` | Brownfield Apple App Expo 57 | `Release` | @@ -248,15 +253,18 @@ 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/RockApp && yarn exec brownfield package:ios --scheme BrownfieldLib --configuration Release --add-spm-package` - `cd apps/ExpoApp58 && 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 Rock` - `Brownfield Apple App Expo 58` - `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/RockApp/ios/.brownfield/package/build` - `apps/ExpoApp58/ios/.brownfield/package/build` - `apps/ExpoApp57/ios/.brownfield/package/build` 5. Add the `BrownfieldLib` product to the matching AppleApp target. @@ -279,6 +287,7 @@ 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-rock-app test` | Rock (`apps/RockApp`) | | `yarn workspace @callstack/brownfield-example-expo-app-58 test` | Expo SDK 58 (`apps/ExpoApp58`) | Package-level scripts (`yarn test` inside `apps/RNApp` or `apps/ExpoApp58`) invoke Jest with each app’s `jest.config.js`. @@ -304,9 +313,11 @@ Per-app Detox scripts (run from the app directory): | ------------------------- | --------------------------- | -------------------------- | ---------------------------------- | | `RNApp` | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `rnAppBrownfield.e2e.js` | | `AppleApp` (vanilla) | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `appleAppBrownfield.e2e.js` | +| `AppleApp` (Rock) | `yarn e2e:build:ios:rock` | `yarn e2e:test:ios:rock` | `appleAppBrownfield.e2e.js` | | `AppleApp` (Expo 58) | `yarn e2e:build:ios:expo58` | `yarn e2e:test:ios:expo58` | `appleAppExpoBrownfield.e2e.js` | | `AppleApp` (Expo 57) | `yarn e2e:build:ios:expo57` | `yarn e2e:test:ios:expo57` | `appleAppExpoBrownfield.e2e.js` | | `AndroidApp` (vanilla) | `yarn e2e:build:android` | `yarn e2e:test:android` | `androidAppBrownfield.e2e.js` | +| `AndroidApp` (Rock) | `yarn e2e:build:android:rock` | `yarn e2e:test:android:rock` | `androidAppBrownfield.e2e.js` | | `AndroidApp` (Expo 58) | `yarn e2e:build:android:expo58` | `yarn e2e:test:android:expo58` | `androidAppExpoBrownfield.e2e.js` | | `AndroidApp` (Expo 57) | `yarn e2e:build:android:expo57` | `yarn e2e:test:android:expo57` | `androidAppExpoBrownfield.e2e.js` | @@ -317,6 +328,7 @@ 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-rock` | No | `RockApp` → package → `AppleApp` build | | `ios-appleapp-expo` (Expo 58) | Yes | `ExpoApp58` → package → `AppleApp` Detox | | `ios-appleapp-expo` (Expo 57) | Yes | `ExpoApp57` → package → `AppleApp` Detox | @@ -325,6 +337,7 @@ Android Detox E2E uses [`.github/actions/androidapp-road-test`](.github/actions/ | Job | E2E | Notes | | ---------------------------------------- | --- | --------------------------------------------- | | `android-androidapp-vanilla` | Yes | `RNApp` → AAR → `AndroidApp` Detox | +| `android-androidapp-rock` | No | `RockApp` → AAR → `AndroidApp` build | | `android-androidapp-expo58-build` / `-e2e` | Yes | `ExpoApp58` → AAR → Detox APKs → emulator | | `android-androidapp-expo57-build` / `-e2e` | Yes | `ExpoApp57` → AAR → Detox APKs → emulator | @@ -340,20 +353,22 @@ From the repo root (macOS + Xcode + Simulator required for iOS). All wrap `scrip | ---------------------------------------------------- | -------------------------------- | | `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 rock` | Local only (CI `ios-appleapp-rock` only builds) | | `yarn ci:local:appleapp:e2e:ios --variant expo58` | CI `ios-appleapp-expo` (Expo 58) | | `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:expo58` / `yarn ci:local:e2e:ios:expo57`. +From `apps/AppleApp`, you can also use `yarn ci:local:e2e:ios:rock` / `yarn ci:local:e2e:ios:expo58` / `yarn ci:local:e2e:ios:expo57`. Android (Android SDK + emulator; defaults to `Pixel_4_API_34`): | Command | Mirrors | | ------------------------------------------------------- | -------------------------------------------- | | `yarn ci:local:androidapp:e2e:android` | CI `android-androidapp-vanilla` | +| `yarn ci:local:androidapp:e2e:android:rock` | Local only (CI `android-androidapp-rock` only builds) | | `yarn ci:local:androidapp:e2e:android:expo58` | CI Expo 58 AndroidApp Detox | | `yarn ci:local:androidapp:e2e:android:expo57` | CI Expo 57 AndroidApp Detox | -From `apps/AndroidApp`, you can also use `yarn ci:local:e2e:android:expo58` / `yarn ci:local:e2e:android:expo57`. +From `apps/AndroidApp`, you can also use `yarn ci:local:e2e:android:rock` / `yarn ci:local:e2e:android:expo58` / `yarn ci:local:e2e:android:expo57`. Common flags (append to any command above): diff --git a/apps/AndroidApp/.detoxrc.rock.cjs b/apps/AndroidApp/.detoxrc.rock.cjs new file mode 100644 index 000000000..da0334127 --- /dev/null +++ b/apps/AndroidApp/.detoxrc.rock.cjs @@ -0,0 +1,10 @@ +const { + createAndroidAppEmulatorReleaseDetoxConfig, +} = require('../brownfield-example-shared-tests/detox-rc-androidapp-emulator-release.cjs'); + +/** @type {import('detox').DetoxConfig} */ +module.exports = createAndroidAppEmulatorReleaseDetoxConfig({ + gradleFlavor: 'rock', + detoxConfiguration: 'android.emu.release.rock', + jestConfigPath: 'e2e/jest.config.rock.cjs', +}); diff --git a/apps/AndroidApp/app/build.gradle.kts b/apps/AndroidApp/app/build.gradle.kts index ec1ee3fc5..439ebcb9d 100644 --- a/apps/AndroidApp/app/build.gradle.kts +++ b/apps/AndroidApp/app/build.gradle.kts @@ -43,6 +43,9 @@ android { create("vanilla") { dimension = "app" } + create("rock") { + dimension = "app" + } } buildTypes { @@ -81,6 +84,7 @@ dependencies { add("expo58Implementation", libs.brownfieldlib.expo58) add("expopreviewImplementation", libs.brownfieldlib.expopreview) add("vanillaImplementation", libs.brownfieldlib.vanilla) + add("rockImplementation", libs.brownfieldlib.rock) implementation(libs.androidx.fragment.compose) testImplementation(libs.junit) diff --git a/apps/AndroidApp/app/src/rock/java/com/callstack/brownfield/android/example/BrownfieldStore.kt b/apps/AndroidApp/app/src/rock/java/com/callstack/brownfield/android/example/BrownfieldStore.kt new file mode 100644 index 000000000..f1393eef4 --- /dev/null +++ b/apps/AndroidApp/app/src/rock/java/com/callstack/brownfield/android/example/BrownfieldStore.kt @@ -0,0 +1,4 @@ +package com.callstack.brownfield.android.example + +typealias BrownfieldStore = com.callstack.rnbrownfield.demo.rockapp.BrownfieldStore +typealias User = com.callstack.rnbrownfield.demo.rockapp.User diff --git a/apps/AndroidApp/app/src/rock/java/com/callstack/brownfield/android/example/ReactNativeConstants.kt b/apps/AndroidApp/app/src/rock/java/com/callstack/brownfield/android/example/ReactNativeConstants.kt new file mode 100644 index 000000000..5c441a931 --- /dev/null +++ b/apps/AndroidApp/app/src/rock/java/com/callstack/brownfield/android/example/ReactNativeConstants.kt @@ -0,0 +1,7 @@ +package com.callstack.brownfield.android.example + +object ReactNativeConstants { + const val MAIN_MODULE_NAME = "RockApp" + const val APP_NAME = "Android" + const val WAIT_FOR_FULL_DISPLAY = true +} diff --git a/apps/AndroidApp/app/src/rock/java/com/callstack/brownfield/android/example/ReactNativeHostManager.kt b/apps/AndroidApp/app/src/rock/java/com/callstack/brownfield/android/example/ReactNativeHostManager.kt new file mode 100644 index 000000000..7fe8de7ea --- /dev/null +++ b/apps/AndroidApp/app/src/rock/java/com/callstack/brownfield/android/example/ReactNativeHostManager.kt @@ -0,0 +1,9 @@ +package com.callstack.brownfield.android.example + +import android.content.res.Configuration + +typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.rockapp.ReactNativeHostManager + +fun ReactNativeHostManager.onConfigurationChanged(application: android.app.Application, newConfig: Configuration) { + // no-op that is prepared to match of the Expo ReactNativeHostManager +} diff --git a/apps/AndroidApp/e2e/jest.config.rock.cjs b/apps/AndroidApp/e2e/jest.config.rock.cjs new file mode 100644 index 000000000..2d92c9dfe --- /dev/null +++ b/apps/AndroidApp/e2e/jest.config.rock.cjs @@ -0,0 +1,14 @@ +const path = require('node:path'); +const { + createDetoxJestConfig, +} = require('../../brownfield-example-shared-tests/e2e/createDetoxJestConfig.cjs'); + +module.exports = createDetoxJestConfig({ + e2eDir: __dirname, + testMatch: [ + path.join( + __dirname, + '../../brownfield-example-shared-tests/e2e/androidAppBrownfield.e2e.js' + ), + ], +}); diff --git a/apps/AndroidApp/gradle/libs.versions.toml b/apps/AndroidApp/gradle/libs.versions.toml index 942d0c5df..965196863 100644 --- a/apps/AndroidApp/gradle/libs.versions.toml +++ b/apps/AndroidApp/gradle/libs.versions.toml @@ -20,6 +20,7 @@ brownfieldlib-expo57 = { module = "com.callstack.rnbrownfield.demo.expoapp57:bro brownfieldlib-expo58 = { module = "com.callstack.rnbrownfield.demo.expoapp58:brownfieldlib", version.ref = "brownfieldlib" } brownfieldlib-expopreview = { module = "com.callstack.rnbrownfield.demo.expoapppreview:brownfieldlib", version.ref = "brownfieldlib" } brownfieldlib-vanilla = { module = "com.rnapp:brownfieldlib", version.ref = "brownfieldlib" } +brownfieldlib-rock = { module = "com.callstack.rnbrownfield.demo.rockapp:brownfieldlib", version.ref = "brownfieldlib" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } diff --git a/apps/AndroidApp/gradle/wrapper/gradle-wrapper.properties b/apps/AndroidApp/gradle/wrapper/gradle-wrapper.properties index e4cefb1a5..16771a352 100644 --- a/apps/AndroidApp/gradle/wrapper/gradle-wrapper.properties +++ b/apps/AndroidApp/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ #Thu Dec 11 23:54:21 CET 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/apps/AndroidApp/package.json b/apps/AndroidApp/package.json index 913405577..ddc16385c 100644 --- a/apps/AndroidApp/package.json +++ b/apps/AndroidApp/package.json @@ -8,13 +8,17 @@ "build:example:android-consumer:expo58": "./gradlew assembleExpo58Release", "build:example:android-consumer:expopreview": "./gradlew assembleExpopreviewRelease", "build:example:android-consumer:vanilla": "./gradlew assembleVanillaRelease", + "build:example:android-consumer:rock": "./gradlew assembleRockRelease", "e2e:build:android": "detox build --configuration android.emu.release", "e2e:test:android": "detox test --configuration android.emu.release", + "e2e:build:android:rock": "detox build --config-path ./.detoxrc.rock.cjs --configuration android.emu.release.rock", + "e2e:test:android:rock": "detox test --config-path ./.detoxrc.rock.cjs --configuration android.emu.release.rock", "e2e:build:android:expo58": "detox build --config-path ./.detoxrc.expo58.cjs --configuration android.emu.release.expo58", "e2e:test:android:expo58": "detox test --config-path ./.detoxrc.expo58.cjs --configuration android.emu.release.expo58", "e2e:build:android:expo57": "detox build --config-path ./.detoxrc.expo57.cjs --configuration android.emu.release.expo57", "e2e:test:android:expo57": "detox test --config-path ./.detoxrc.expo57.cjs --configuration android.emu.release.expo57", "ci:local:e2e:android": "bash ../../scripts/ci-local-androidapp-android-e2e.sh", + "ci:local:e2e:android:rock": "bash ../../scripts/ci-local-androidapp-android-e2e.sh --variant rock", "ci:local:e2e:android:expo58": "bash ../../scripts/ci-local-androidapp-android-e2e.sh --variant expo58", "ci:local:e2e:android:expo57": "bash ../../scripts/ci-local-androidapp-android-e2e.sh --variant expo57" }, diff --git a/apps/AppleApp/.detoxrc.rock.cjs b/apps/AppleApp/.detoxrc.rock.cjs new file mode 100644 index 000000000..f78b492ea --- /dev/null +++ b/apps/AppleApp/.detoxrc.rock.cjs @@ -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('rock'); + +/** @type {import('detox').DetoxConfig} */ +module.exports = createAppleAppIosSimDebugDetoxConfig({ + scheme: variant.scheme, + configuration: variant.configuration, + appBinaryName: variant.appBinaryName, + detoxConfiguration: variant.detoxConfiguration, + jestConfigPath: 'e2e/jest.config.rock.cjs', +}); diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj index 7709cb2c8..9e477d741 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj @@ -490,7 +490,7 @@ }; 7A1B2C3D4E5F60718293A301 /* Brownfield Apple App (ExpoAppPreview) */ = { isa = PBXNativeTarget; - buildConfigurationList = 7A1B2C3D4E5F60718293A405 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoAppPreview)" */; + buildConfigurationList = 7A1B2C3D4E5F60718293A500 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoAppPreview)" */; buildPhases = ( 7A1B2C3D4E5F60718293A302 /* Sources */, 7A1B2C3D4E5F60718293A204 /* Frameworks */, @@ -1325,6 +1325,124 @@ }; name = "Release Vanilla"; }; + 7A1B2C3D4E5F60718293A405 /* Debug Rock */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = "Debug Rock"; + }; + 7A1B2C3D4E5F60718293A406 /* Release Rock */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = "Release Rock"; + }; 7A1B2C3D4E5F60718293A403 /* Debug Vanilla */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1419,6 +1537,100 @@ }; name = "Release Vanilla"; }; + 7A1B2C3D4E5F60718293A407 /* Debug Rock */ = { + 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_ROCK_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 = YES; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Debug Rock"; + }; + 7A1B2C3D4E5F60718293A408 /* Release Rock */ = { + 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_ROCK_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 = YES; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Release Rock"; + }; 7A1B2C3D4E5F60718293A501 /* Debug Expo */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1628,6 +1840,8 @@ 793C76B12EEBF939008A2A34 /* Release Expo */, 7A1B2C3D4E5F60718293A401 /* Debug Vanilla */, 7A1B2C3D4E5F60718293A402 /* Release Vanilla */, + 7A1B2C3D4E5F60718293A405 /* Debug Rock */, + 7A1B2C3D4E5F60718293A406 /* Release Rock */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = "Release Expo"; @@ -1639,6 +1853,8 @@ 793C76B42EEBF939008A2A34 /* Release Expo */, 7A1B2C3D4E5F60718293A403 /* Debug Vanilla */, 7A1B2C3D4E5F60718293A404 /* Release Vanilla */, + 7A1B2C3D4E5F60718293A407 /* Debug Rock */, + 7A1B2C3D4E5F60718293A408 /* Release Rock */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = "Release Expo"; @@ -1654,7 +1870,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = "Release Expo"; }; - 7A1B2C3D4E5F60718293A405 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoAppPreview)" */ = { + 7A1B2C3D4E5F60718293A500 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoAppPreview)" */ = { isa = XCConfigurationList; buildConfigurations = ( 7A1B2C3D4E5F60718293A501 /* Debug Expo */, diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Rock.xcscheme b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Rock.xcscheme new file mode 100644 index 000000000..e16fd43fb --- /dev/null +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Rock.xcscheme @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 acf6f5329..2d1e9d061 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist @@ -14,11 +14,16 @@ orderHint 1 - Brownfield Apple App Vanilla.xcscheme + Brownfield Apple App Rock.xcscheme orderHint 3 + Brownfield Apple App Vanilla.xcscheme + + orderHint + 4 + SuppressBuildableAutocreation diff --git a/apps/AppleApp/Brownfield Apple App/components/ContentView.swift b/apps/AppleApp/Brownfield Apple App/components/ContentView.swift index 4ab83153c..240ab510e 100644 --- a/apps/AppleApp/Brownfield Apple App/components/ContentView.swift +++ b/apps/AppleApp/Brownfield Apple App/components/ContentView.swift @@ -15,6 +15,8 @@ let initialState = BrownfieldStore( #if USE_EXPO_HOST private let hostAppName = "iOS Expo" +#elseif USE_ROCK_HOST +private let hostAppName = "iOS Rock" #else private let hostAppName = "iOS Vanilla" #endif diff --git a/apps/AppleApp/Brownfield Apple App/components/RNAppScreen.swift b/apps/AppleApp/Brownfield Apple App/components/RNAppScreen.swift index 217f2749d..5d38821dc 100644 --- a/apps/AppleApp/Brownfield Apple App/components/RNAppScreen.swift +++ b/apps/AppleApp/Brownfield Apple App/components/RNAppScreen.swift @@ -6,6 +6,9 @@ import UIKit private let reactNativeModuleName = "main" // The Expo example bundles do not yet send the JS full-display marker. private let waitForFullDisplay = false +#elseif USE_ROCK_HOST +private let reactNativeModuleName = "RockApp" +private let waitForFullDisplay = true #else private let reactNativeModuleName = "RNApp" private let waitForFullDisplay = true diff --git a/apps/AppleApp/e2e/jest.config.rock.cjs b/apps/AppleApp/e2e/jest.config.rock.cjs new file mode 100644 index 000000000..b5d845c2b --- /dev/null +++ b/apps/AppleApp/e2e/jest.config.rock.cjs @@ -0,0 +1,19 @@ +const path = require('node:path'); +const { + createDetoxJestConfig, +} = require('../../brownfield-example-shared-tests/e2e/createDetoxJestConfig.cjs'); +const { + getAppleAppDetoxVariant, +} = require('../../brownfield-example-shared-tests/detox-appleapp-variants.cjs'); + +const variant = getAppleAppDetoxVariant('rock'); + +module.exports = createDetoxJestConfig({ + e2eDir: __dirname, + testMatch: [ + path.join( + __dirname, + `../../brownfield-example-shared-tests/e2e/${variant.e2eTestFile}` + ), + ], +}); diff --git a/apps/AppleApp/package.json b/apps/AppleApp/package.json index 61c4d2e1e..41935b38f 100644 --- a/apps/AppleApp/package.json +++ b/apps/AppleApp/package.json @@ -9,14 +9,18 @@ "build:example:ios-consumer:expo58": "node prepareXCFrameworks.js --appName ExpoApp58 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 58\" -configuration Release", "build:example:ios-consumer:expopreview": "node prepareXCFrameworks.js --appName ExpoAppPreview && yarn internal::build::common -scheme \"Brownfield Apple App Expo Preview\" -configuration Release", "build:example:ios-consumer:vanilla": "node prepareXCFrameworks.js --appName RNApp && yarn internal::build::common -scheme \"Brownfield Apple App Vanilla\" -configuration \"Release Vanilla\"", + "build:example:ios-consumer:rock": "node prepareXCFrameworks.js --appName RockApp && yarn internal::build::common -scheme \"Brownfield Apple App Rock\" -configuration \"Release Rock\"", "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:rock": "detox build --config-path .detoxrc.rock.cjs --configuration ios.sim.debug.rock", + "e2e:test:ios:rock": "detox test --config-path .detoxrc.rock.cjs --configuration ios.sim.debug.rock", "e2e:build:ios:expo58": "detox build --config-path .detoxrc.expo58.cjs --configuration ios.sim.debug.expo58", "e2e:test:ios:expo58": "detox test --config-path .detoxrc.expo58.cjs --configuration ios.sim.debug.expo58", "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:rock": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh --variant rock", "ci:local:e2e:ios:expo58": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh --variant expo58", "ci:local:e2e:ios:expo57": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh --variant expo57" }, diff --git a/apps/README.md b/apps/README.md index e5ff8bce3..23d309785 100644 --- a/apps/README.md +++ b/apps/README.md @@ -6,12 +6,18 @@ This directory contains demo projects showcasing the usage of the `react-native- - `ExpoApp58` - Expo application using Expo SDK v58 (primary Expo Updates demo) - `ExpoApp57` - Expo application using Expo SDK v57 (default `expo` consumer alias) - `ExpoAppPreview` - a temporary Expo app generated in CI to test new Expo preview releases before stable support is added -- `AndroidApp` - the native Android application that integrates the RNApp AAR package (a "consumer" of the RNApp library); it comes in two flavors: - - `expo` - which uses the artifact produced from `ExpoApp` +- `RockApp` - an equivalent React Native application powered by [Rock](https://rockjs.dev) (instead of the React Native Community CLI). It shares the same UI as `RNApp` via the `brownfield-example-shared` package and is packaged to AAR / XCFramework using Rock's brownfield plugins. +- `brownfield-example-shared` - workspace package containing the React Native UI shared by `RNApp` and `RockApp` (root `App`, `HomeScreen`, `Counter`, navigation stack, theming helpers, native OS version context) +- `brownfield-example-shared-tests` - workspace package containing the Jest test suites shared by the demo apps +- `AndroidApp` - the native Android application that integrates the packaged AARs (a "consumer" of the RN apps); it comes in these flavors: + - `expo58` / `expo57` - which use the artifacts produced from `ExpoApp58` / `ExpoApp57` + - `expopreview` - which uses the artifact produced from `ExpoAppPreview` - `vanilla` - which uses the artifact produced from `RNApp` + - `rock` - which uses the artifact produced from `RockApp` - `AppleApp` - the native iOS application that integrates packaged XCFrameworks (a "consumer" of the RN apps); the Xcode project defines one target per consumed RN app: - `Brownfield Apple App (RNApp)` — vanilla; uses the artifact from `RNApp` (scheme **Brownfield Apple App Vanilla**, configuration `Release Vanilla`) + - `Brownfield Apple App (RNApp)` — Rock; the same target, using the artifact from `RockApp` (scheme **Brownfield Apple App Rock**, configuration `Release Rock`) - `Brownfield Apple App (ExpoApp58)` — uses the artifact from `ExpoApp58` (scheme **Brownfield Apple App Expo 58**, configuration `Release`) - `Brownfield Apple App (ExpoApp57)` — uses the artifact from `ExpoApp57` (scheme **Brownfield Apple App Expo 57**, configuration `Release`) - `Brownfield Apple App (ExpoAppPreview)` — uses the artifact from `ExpoAppPreview` (scheme **Brownfield Apple App Expo Preview**, configuration `Release`) - From `apps/AppleApp`, run `yarn build:example:ios-consumer:vanilla`, `yarn build:example:ios-consumer:expo58`, `yarn build:example:ios-consumer:expo57`, or `yarn build:example:ios-consumer:expopreview` to copy XCFrameworks into `package/` and build the matching target. `yarn build:example:ios-consumer:expo` is an alias for `expo57`. + From `apps/AppleApp`, run `yarn build:example:ios-consumer:vanilla`, `yarn build:example:ios-consumer:rock`, `yarn build:example:ios-consumer:expo58`, `yarn build:example:ios-consumer:expo57`, or `yarn build:example:ios-consumer:expopreview` to copy XCFrameworks into `package/` and build the matching target. `yarn build:example:ios-consumer:expo` is an alias for `expo57`. diff --git a/apps/RNApp/__tests__/App.test.tsx b/apps/RNApp/__tests__/App.test.tsx index f6ad9fa1a..00ad18ff2 100644 --- a/apps/RNApp/__tests__/App.test.tsx +++ b/apps/RNApp/__tests__/App.test.tsx @@ -3,7 +3,7 @@ */ import ReactTestRenderer from 'react-test-renderer'; -import App from '../src/App'; +import { App } from '@callstack/brownfield-example-shared'; test('renders correctly', async () => { await ReactTestRenderer.act(() => { diff --git a/apps/RNApp/__tests__/brownfield.example.test.tsx b/apps/RNApp/__tests__/brownfield.example.test.tsx index 5ce7dcfcc..a66efda51 100644 --- a/apps/RNApp/__tests__/brownfield.example.test.tsx +++ b/apps/RNApp/__tests__/brownfield.example.test.tsx @@ -2,9 +2,11 @@ import { runCounterSuite, runHomeScreenSuite, } from '@callstack/brownfield-example-shared-tests'; -import { HomeScreen } from '../src/HomeScreen'; -import Counter from '../src/components/counter'; -import { getRandomTheme } from '../src/utils'; +import { + Counter, + getRandomTheme, + HomeScreen, +} from '@callstack/brownfield-example-shared'; const theme = getRandomTheme(); diff --git a/apps/RNApp/index.js b/apps/RNApp/index.js index 752e7ee3c..4dff149b5 100644 --- a/apps/RNApp/index.js +++ b/apps/RNApp/index.js @@ -2,8 +2,10 @@ * @format */ +import './BrownfieldStore.brownie'; + import { AppRegistry } from 'react-native'; -import App from './src/App'; +import { App } from '@callstack/brownfield-example-shared'; import { name as appName } from './app.json'; AppRegistry.registerComponent(appName, () => App); diff --git a/apps/RNApp/jest.config.js b/apps/RNApp/jest.config.js index 4e9a70735..2178ee6cf 100644 --- a/apps/RNApp/jest.config.js +++ b/apps/RNApp/jest.config.js @@ -24,6 +24,6 @@ module.exports = { ), }, transformIgnorePatterns: [ - 'node_modules/(?!((jest-)?react-native|@react-native(-community)?|@callstack/brownfield-example-shared-tests|@react-navigation|react-native-screens|react-native-safe-area-context)/)', + 'node_modules/(?!((jest-)?react-native|@react-native(-community)?|@callstack/brownfield-example-shared|@callstack/brownfield-example-shared-tests|@react-navigation|react-native-screens|react-native-safe-area-context)/)', ], }; diff --git a/apps/RNApp/package.json b/apps/RNApp/package.json index b7c76f172..e42253834 100644 --- a/apps/RNApp/package.json +++ b/apps/RNApp/package.json @@ -17,9 +17,10 @@ "e2e:test:ios": "detox test --configuration ios.sim.debug", "ci:local:e2e:ios": "bash ../../scripts/ci-local-rnapp-ios-e2e.sh", "codegen": "brownfield codegen", - "codegen:navigation": "brownfield navigation:codegen brownfield.navigation.ts" + "codegen:navigation": "yarn workspace @callstack/brownfield-example-shared codegen:navigation" }, "dependencies": { + "@callstack/brownfield-example-shared": "workspace:^", "@callstack/brownfield-example-shared-tests": "workspace:^", "@callstack/brownfield-navigation": "workspace:^", "@callstack/brownie": "workspace:^", diff --git a/apps/RockApp/.bundle/config b/apps/RockApp/.bundle/config new file mode 100644 index 000000000..848943bb5 --- /dev/null +++ b/apps/RockApp/.bundle/config @@ -0,0 +1,2 @@ +BUNDLE_PATH: "vendor/bundle" +BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/apps/RockApp/.detoxrc.cjs b/apps/RockApp/.detoxrc.cjs new file mode 100644 index 000000000..c7c9b3e9b --- /dev/null +++ b/apps/RockApp/.detoxrc.cjs @@ -0,0 +1,10 @@ +const { + createIosSimDebugDetoxConfig, +} = require('../brownfield-example-shared-tests/detox-rc-ios-sim-debug.cjs'); + +/** @type {import('detox').DetoxConfig} */ +module.exports = createIosSimDebugDetoxConfig({ + workspace: 'RockApp', + scheme: 'RockApp', + appBinaryName: 'RockApp', +}); diff --git a/apps/RockApp/.gitignore b/apps/RockApp/.gitignore new file mode 100644 index 000000000..7f1aed1e3 --- /dev/null +++ b/apps/RockApp/.gitignore @@ -0,0 +1,82 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +**/.xcode.env.local + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof +.cxx/ +*.keystore +!debug.keystore +.kotlin/ + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +**/fastlane/report.xml +**/fastlane/Preview.html +**/fastlane/screenshots +**/fastlane/test_output + +# Bundle artifact +*.jsbundle + +# Ruby / CocoaPods +**/Pods/ +/vendor/bundle/ + +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* + +# testing +/coverage +/e2e-artifacts + +# Yarn +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# Rock +.rock/ + +libsDebug/ +libsRelease/ \ No newline at end of file diff --git a/apps/RockApp/.prettierrc.js b/apps/RockApp/.prettierrc.js new file mode 100644 index 000000000..06860c8d1 --- /dev/null +++ b/apps/RockApp/.prettierrc.js @@ -0,0 +1,5 @@ +module.exports = { + arrowParens: 'avoid', + singleQuote: true, + trailingComma: 'all', +}; diff --git a/apps/RockApp/BrownfieldStore.brownie.ts b/apps/RockApp/BrownfieldStore.brownie.ts new file mode 100644 index 000000000..94e22c72f --- /dev/null +++ b/apps/RockApp/BrownfieldStore.brownie.ts @@ -0,0 +1,21 @@ +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/RockApp/Gemfile b/apps/RockApp/Gemfile new file mode 100644 index 000000000..0f0c3b8f1 --- /dev/null +++ b/apps/RockApp/Gemfile @@ -0,0 +1,17 @@ +source 'https://rubygems.org' + +# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version +ruby ">= 2.6.10" + +# Exclude problematic versions of cocoapods and activesupport that causes build failures. +gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1' +gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0' +gem 'xcodeproj', '< 1.26.0' +gem 'concurrent-ruby', '< 1.3.4' + +# Ruby 3.4.0 has removed some libraries from the standard library. +gem 'bigdecimal' +gem 'logger' +gem 'benchmark' +gem 'mutex_m' +gem 'nkf' diff --git a/apps/RockApp/Gemfile.lock b/apps/RockApp/Gemfile.lock new file mode 100644 index 000000000..23a33ef49 --- /dev/null +++ b/apps/RockApp/Gemfile.lock @@ -0,0 +1,123 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.8) + activesupport (7.2.3.1) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1, < 6) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + base64 (0.3.0) + benchmark (0.5.0) + bigdecimal (4.1.2) + claide (1.1.0) + cocoapods (1.15.2) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.15.2) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 2.3.0, < 3.0) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.15.2) + activesupport (>= 5.0, < 8) + addressable (~> 2.8) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + public_suffix (~> 4.0) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (2.1) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.2.0) + colored2 (3.1.2) + concurrent-ruby (1.3.3) + connection_pool (3.0.2) + drb (2.2.3) + escape (0.0.4) + ethon (0.18.0) + ffi (>= 1.15.0) + logger + ffi (1.17.4) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.9.0) + mutex_m + i18n (1.14.8) + concurrent-ruby (~> 1.0) + json (2.19.5) + logger (1.7.0) + minitest (5.27.0) + molinillo (0.8.0) + mutex_m (0.3.0) + nanaimo (0.3.0) + nap (1.1.0) + netrc (0.11.0) + nkf (0.2.0) + public_suffix (4.0.7) + rexml (3.4.4) + ruby-macho (2.5.1) + securerandom (0.4.1) + typhoeus (1.6.0) + ethon (>= 0.18.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + xcodeproj (1.25.1) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (>= 3.3.6, < 4.0) + +PLATFORMS + ruby + +DEPENDENCIES + activesupport (>= 6.1.7.5, != 7.1.0) + benchmark + bigdecimal + cocoapods (>= 1.13, != 1.15.1, != 1.15.0) + concurrent-ruby (< 1.3.4) + logger + mutex_m + nkf + xcodeproj (< 1.26.0) + +RUBY VERSION + ruby 3.4.3p32 + +BUNDLED WITH + 2.6.7 diff --git a/apps/RockApp/README.md b/apps/RockApp/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/apps/RockApp/__tests__/App.test.tsx b/apps/RockApp/__tests__/App.test.tsx new file mode 100644 index 000000000..00ad18ff2 --- /dev/null +++ b/apps/RockApp/__tests__/App.test.tsx @@ -0,0 +1,12 @@ +/** + * @format + */ + +import ReactTestRenderer from 'react-test-renderer'; +import { App } from '@callstack/brownfield-example-shared'; + +test('renders correctly', async () => { + await ReactTestRenderer.act(() => { + ReactTestRenderer.create(); + }); +}); diff --git a/apps/RockApp/__tests__/brownfield.example.test.tsx b/apps/RockApp/__tests__/brownfield.example.test.tsx new file mode 100644 index 000000000..4c1778ef3 --- /dev/null +++ b/apps/RockApp/__tests__/brownfield.example.test.tsx @@ -0,0 +1,14 @@ +import { + runCounterSuite, + runHomeScreenSuite, +} from '@callstack/brownfield-example-shared-tests'; +import { + Counter, + getRandomTheme, + HomeScreen, +} from '@callstack/brownfield-example-shared'; + +const theme = getRandomTheme(); + +runHomeScreenSuite('RockApp', HomeScreen); +runCounterSuite('RockApp', Counter, { colors: theme }); diff --git a/apps/RockApp/android/app/build.gradle b/apps/RockApp/android/app/build.gradle new file mode 100644 index 000000000..d434a0d42 --- /dev/null +++ b/apps/RockApp/android/app/build.gradle @@ -0,0 +1,119 @@ +apply plugin: "com.android.application" +apply plugin: "org.jetbrains.kotlin.android" +apply plugin: "com.facebook.react" + +/** + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. + */ +react { + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '../..' + // root = file("../../") + // The folder where the react-native NPM package is. Default is ../../node_modules/react-native + // reactNativeDir = file("../../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen + // codegenDir = file("../../node_modules/@react-native/codegen") + // The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js + cliFile = file("../../node_modules/rock/dist/src/bin.js") + + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + // nodeExecutableAndArgs = ["node"] + // + // The command to run when bundling. By default is 'bundle' + // bundleCommand = "ram-bundle" + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] + + /* Autolinking */ + autolinkLibrariesWithApp() +} + +/** + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + */ +def enableProguardInReleaseBuilds = true + +/** + * The preferred build flavor of JavaScriptCore (JSC) + * + * For example, to use the international variant, you can use: + * `def jscFlavor = io.github.react-native-community:jsc-android-intl:2026004.+` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+' + +android { + ndkVersion rootProject.ext.ndkVersion + buildToolsVersion rootProject.ext.buildToolsVersion + compileSdk rootProject.ext.compileSdkVersion + + namespace "com.callstack.rnbrownfield.demo.rockapp" + defaultConfig { + applicationId "com.callstack.rnbrownfield.demo.rockapp" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://reactnative.dev/docs/signed-apk-android. + signingConfig signingConfigs.debug + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" + } + } +} + +dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } +} diff --git a/apps/RockApp/android/app/debug.keystore b/apps/RockApp/android/app/debug.keystore new file mode 100644 index 000000000..364e105ed Binary files /dev/null and b/apps/RockApp/android/app/debug.keystore differ diff --git a/apps/RockApp/android/app/proguard-rules.pro b/apps/RockApp/android/app/proguard-rules.pro new file mode 100644 index 000000000..11b025724 --- /dev/null +++ b/apps/RockApp/android/app/proguard-rules.pro @@ -0,0 +1,10 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: diff --git a/apps/RockApp/android/app/src/debug/AndroidManifest.xml b/apps/RockApp/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..eb98c01af --- /dev/null +++ b/apps/RockApp/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/apps/RockApp/android/app/src/main/AndroidManifest.xml b/apps/RockApp/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..fb78f3974 --- /dev/null +++ b/apps/RockApp/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/apps/RockApp/android/app/src/main/java/com/callstack/rnbrownfield/demo/rockapp/MainActivity.kt b/apps/RockApp/android/app/src/main/java/com/callstack/rnbrownfield/demo/rockapp/MainActivity.kt new file mode 100644 index 000000000..2b43168fd --- /dev/null +++ b/apps/RockApp/android/app/src/main/java/com/callstack/rnbrownfield/demo/rockapp/MainActivity.kt @@ -0,0 +1,22 @@ +package com.callstack.rnbrownfield.demo.rockapp + +import com.facebook.react.ReactActivity +import com.facebook.react.ReactActivityDelegate +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled +import com.facebook.react.defaults.DefaultReactActivityDelegate + +class MainActivity : ReactActivity() { + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + override fun getMainComponentName(): String = "RockApp" + + /** + * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] + * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] + */ + override fun createReactActivityDelegate(): ReactActivityDelegate = + DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) +} diff --git a/apps/RockApp/android/app/src/main/java/com/callstack/rnbrownfield/demo/rockapp/MainApplication.kt b/apps/RockApp/android/app/src/main/java/com/callstack/rnbrownfield/demo/rockapp/MainApplication.kt new file mode 100644 index 000000000..d3dda1135 --- /dev/null +++ b/apps/RockApp/android/app/src/main/java/com/callstack/rnbrownfield/demo/rockapp/MainApplication.kt @@ -0,0 +1,27 @@ +package com.callstack.rnbrownfield.demo.rockapp + +import android.app.Application +import com.facebook.react.PackageList +import com.facebook.react.ReactApplication +import com.facebook.react.ReactHost +import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative +import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost + +class MainApplication : Application(), ReactApplication { + + override val reactHost: ReactHost by lazy { + getDefaultReactHost( + context = applicationContext, + packageList = + PackageList(this).packages.apply { + // Packages that cannot be autolinked yet can be added manually here, for example: + // add(MyReactNativePackage()) + }, + ) + } + + override fun onCreate() { + super.onCreate() + loadReactNative(this) + } +} diff --git a/apps/RockApp/android/app/src/main/res/drawable/rn_edit_text_material.xml b/apps/RockApp/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 000000000..5c25e728e --- /dev/null +++ b/apps/RockApp/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/apps/RockApp/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/apps/RockApp/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..a2f590828 Binary files /dev/null and b/apps/RockApp/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/apps/RockApp/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/apps/RockApp/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 000000000..1b5239980 Binary files /dev/null and b/apps/RockApp/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/apps/RockApp/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/apps/RockApp/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..ff10afd6e Binary files /dev/null and b/apps/RockApp/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/apps/RockApp/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/apps/RockApp/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 000000000..115a4c768 Binary files /dev/null and b/apps/RockApp/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/apps/RockApp/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/apps/RockApp/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..dcd3cd808 Binary files /dev/null and b/apps/RockApp/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/apps/RockApp/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/apps/RockApp/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 000000000..459ca609d Binary files /dev/null and b/apps/RockApp/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/apps/RockApp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/apps/RockApp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..8ca12fe02 Binary files /dev/null and b/apps/RockApp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/apps/RockApp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/apps/RockApp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..8e19b410a Binary files /dev/null and b/apps/RockApp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/apps/RockApp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/apps/RockApp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b824ebdd4 Binary files /dev/null and b/apps/RockApp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/apps/RockApp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/apps/RockApp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..4c19a13c2 Binary files /dev/null and b/apps/RockApp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/apps/RockApp/android/app/src/main/res/values/strings.xml b/apps/RockApp/android/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..eba6bdc67 --- /dev/null +++ b/apps/RockApp/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + RockApp + diff --git a/apps/RockApp/android/app/src/main/res/values/styles.xml b/apps/RockApp/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..7ba83a2ad --- /dev/null +++ b/apps/RockApp/android/app/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/apps/RockApp/android/brownfieldlib/build.gradle.kts b/apps/RockApp/android/brownfieldlib/build.gradle.kts new file mode 100644 index 000000000..03147f0f6 --- /dev/null +++ b/apps/RockApp/android/brownfieldlib/build.gradle.kts @@ -0,0 +1,103 @@ +import groovy.json.JsonOutput +import groovy.json.JsonSlurper + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.android") + id("com.callstack.react.brownfield") + `maven-publish` + id("com.facebook.react") +} + +react { + autolinkLibrariesWithApp() +} + +repositories { + mavenCentral() +} + +android { + namespace = "com.callstack.rnbrownfield.demo.rockapp" + compileSdk = 37 + + defaultConfig { + minSdk = 24 + + buildConfigField("boolean", "IS_EDGE_TO_EDGE_ENABLED", properties["edgeToEdgeEnabled"].toString()) + buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", properties["newArchEnabled"].toString()) + buildConfigField("boolean", "IS_HERMES_ENABLED", properties["hermesEnabled"].toString()) + } + + publishing { + multipleVariants { + allVariants() + } + } +} + +publishing { + publications { + create("mavenAar") { + groupId = "com.callstack.rnbrownfield.demo.rockapp" + artifactId = "brownfieldlib" + version = "0.0.1-SNAPSHOT" + afterEvaluate { + from(components.getByName("default")) + } + + pom { + withXml { + /** + * As a result of `from(components.getByName("default")` all of the project + * dependencies are added to `pom.xml` file. We do not need the react-native + * third party dependencies to be a part of it as we embed those dependencies. + */ + val dependenciesNode = (asNode().get("dependencies") as groovy.util.NodeList).first() as groovy.util.Node + dependenciesNode.children() + .filterIsInstance() + .filter { (it.get("groupId") as groovy.util.NodeList).text() == rootProject.name } + .forEach { dependenciesNode.remove(it) } + } + } + } + } + + repositories { + mavenLocal() // Publishes to the local Maven repository (~/.m2/repository) + } +} + +dependencies { + implementation("androidx.core:core-ktx:1.17.0") + implementation("androidx.appcompat:appcompat:1.7.1") + implementation("com.google.android.material:material:1.13.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.3.0") + androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0") + api("com.facebook.react:react-android:0.87.0") + api("com.facebook.hermes:hermes-android:250829098.0.16") +} + +val moduleBuildDir: Directory = layout.buildDirectory.get() + +/** + * As a result of `from(components.getByName("default")` all of the project + * dependencies are added to `module.json` file. We do not need the react-native + * third party dependencies to be a part of it as we embed those dependencies. + */ +tasks.register("removeDependenciesFromModuleFile") { + doLast { + file("$moduleBuildDir/publications/mavenAar/module.json").run { + val json = inputStream().use { JsonSlurper().parse(it) as Map } + (json["variants"] as? List>)?.forEach { variant -> + (variant["dependencies"] as? MutableList>)?.removeAll { it["group"] == rootProject.name } + } + writer().use { it.write(JsonOutput.prettyPrint(JsonOutput.toJson(json))) } + } + } +} + +tasks.named("generateMetadataFileForMavenAarPublication") { + finalizedBy("removeDependenciesFromModuleFile") +} \ No newline at end of file diff --git a/apps/RockApp/android/brownfieldlib/src/main/java/com/callstack/rnbrownfield/demo/rockapp/Generated/BrownfieldStore.kt b/apps/RockApp/android/brownfieldlib/src/main/java/com/callstack/rnbrownfield/demo/rockapp/Generated/BrownfieldStore.kt new file mode 100644 index 000000000..9d2bb7b08 --- /dev/null +++ b/apps/RockApp/android/brownfieldlib/src/main/java/com/callstack/rnbrownfield/demo/rockapp/Generated/BrownfieldStore.kt @@ -0,0 +1,14 @@ +package com.callstack.rnbrownfield.demo.rockapp + +data class BrownfieldStore ( + val counter: Double, + val user: User +) { + companion object { + const val STORE_NAME = "BrownfieldStore" + } +} + +data class User ( + val name: String +) diff --git a/apps/RockApp/android/brownfieldlib/src/main/java/com/callstack/rnbrownfield/demo/rockapp/Generated/SettingsStore.kt b/apps/RockApp/android/brownfieldlib/src/main/java/com/callstack/rnbrownfield/demo/rockapp/Generated/SettingsStore.kt new file mode 100644 index 000000000..ab4e851a0 --- /dev/null +++ b/apps/RockApp/android/brownfieldlib/src/main/java/com/callstack/rnbrownfield/demo/rockapp/Generated/SettingsStore.kt @@ -0,0 +1,16 @@ +package com.callstack.rnbrownfield.demo.rockapp + +data class SettingsStore ( + val notificationsEnabled: Boolean, + val privacyMode: Boolean, + val theme: Theme +) { + companion object { + const val STORE_NAME = "SettingsStore" + } +} + +enum class Theme { + Dark, + Light +} diff --git a/apps/RockApp/android/brownfieldlib/src/main/java/com/callstack/rnbrownfield/demo/rockapp/ReactNativeHostManager.kt b/apps/RockApp/android/brownfieldlib/src/main/java/com/callstack/rnbrownfield/demo/rockapp/ReactNativeHostManager.kt new file mode 100644 index 000000000..769fd2908 --- /dev/null +++ b/apps/RockApp/android/brownfieldlib/src/main/java/com/callstack/rnbrownfield/demo/rockapp/ReactNativeHostManager.kt @@ -0,0 +1,13 @@ +package com.callstack.rnbrownfield.demo.rockapp + +import android.app.Application +import com.callstack.reactnativebrownfield.OnJSBundleLoaded +import com.callstack.reactnativebrownfield.ReactNativeBrownfield +import com.facebook.react.PackageList + +object ReactNativeHostManager { + fun initialize(application: Application, onJSBundleLoaded: OnJSBundleLoaded? = null) { + val packageList = PackageList(application).packages + ReactNativeBrownfield.initialize(application, packageList, onJSBundleLoaded) + } +} diff --git a/apps/RockApp/android/build.gradle b/apps/RockApp/android/build.gradle new file mode 100644 index 000000000..c0be208fe --- /dev/null +++ b/apps/RockApp/android/build.gradle @@ -0,0 +1,23 @@ +buildscript { + ext { + buildToolsVersion = "37.0.0" + minSdkVersion = 24 + compileSdkVersion = 37 + targetSdkVersion = 36 + ndkVersion = "27.1.12297006" + kotlinVersion = "2.2.0" + } + repositories { + mavenLocal() + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle") + classpath("com.facebook.react:react-native-gradle-plugin") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") + classpath("com.callstack.react:brownfield-gradle-plugin:2.0.0-alpha08") // check the latest version: https://mvnrepository.com/artifact/com.callstack.react/brownfield-gradle-plugin + } +} + +apply plugin: "com.facebook.react.rootproject" diff --git a/apps/RockApp/android/gradle.properties b/apps/RockApp/android/gradle.properties new file mode 100644 index 000000000..50a0ed633 --- /dev/null +++ b/apps/RockApp/android/gradle.properties @@ -0,0 +1,49 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=true + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true + +# Use this property to enable edge-to-edge display support. +# This allows your app to draw behind system bars for an immersive UI. +# Note: Only works with ReactActivity and should not be used with custom Activity. +edgeToEdgeEnabled=true + +# Opt out of built-in kotlin and new DSL behavior that ships with AGP 9. +# Starting from AGP 10.x these opt outs will be removed. +android.builtInKotlin=false +android.newDsl=false \ No newline at end of file diff --git a/apps/RockApp/android/gradle/wrapper/gradle-wrapper.jar b/apps/RockApp/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..8bdaf60c7 Binary files /dev/null and b/apps/RockApp/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/apps/RockApp/android/gradle/wrapper/gradle-wrapper.properties b/apps/RockApp/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..c61a118f7 --- /dev/null +++ b/apps/RockApp/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/apps/RockApp/android/gradlew b/apps/RockApp/android/gradlew new file mode 100755 index 000000000..ef07e0162 --- /dev/null +++ b/apps/RockApp/android/gradlew @@ -0,0 +1,251 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/apps/RockApp/android/gradlew.bat b/apps/RockApp/android/gradlew.bat new file mode 100644 index 000000000..11bf18292 --- /dev/null +++ b/apps/RockApp/android/gradlew.bat @@ -0,0 +1,99 @@ +@REM Copyright (c) Meta Platforms, Inc. and affiliates. +@REM +@REM This source code is licensed under the MIT license found in the +@REM LICENSE file in the root directory of this source tree. + +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/apps/RockApp/android/settings.gradle b/apps/RockApp/android/settings.gradle new file mode 100644 index 000000000..659534207 --- /dev/null +++ b/apps/RockApp/android/settings.gradle @@ -0,0 +1,7 @@ +pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } +plugins { id("com.facebook.react.settings") } +extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand(['npx', 'rock', 'config', '-p', 'android']) } +rootProject.name = 'RockApp' +include ':app' +includeBuild('../node_modules/@react-native/gradle-plugin') +include(":brownfieldlib") diff --git a/apps/RockApp/app.json b/apps/RockApp/app.json new file mode 100644 index 000000000..138b0893a --- /dev/null +++ b/apps/RockApp/app.json @@ -0,0 +1,4 @@ +{ + "name": "RockApp", + "displayName": "RockApp" +} diff --git a/apps/RockApp/babel.config.js b/apps/RockApp/babel.config.js new file mode 100644 index 000000000..f7b3da3b3 --- /dev/null +++ b/apps/RockApp/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['module:@react-native/babel-preset'], +}; diff --git a/apps/RockApp/e2e/jest.config.cjs b/apps/RockApp/e2e/jest.config.cjs new file mode 100644 index 000000000..69f4d31d1 --- /dev/null +++ b/apps/RockApp/e2e/jest.config.cjs @@ -0,0 +1,14 @@ +const path = require('node:path'); +const { + createDetoxJestConfig, +} = require('../../brownfield-example-shared-tests/e2e/createDetoxJestConfig.cjs'); + +module.exports = createDetoxJestConfig({ + e2eDir: __dirname, + testMatch: [ + path.join( + __dirname, + '../../brownfield-example-shared-tests/e2e/rnAppBrownfield.e2e.js', + ), + ], +}); diff --git a/apps/RockApp/eslint.config.mjs b/apps/RockApp/eslint.config.mjs new file mode 100644 index 000000000..79e239c3e --- /dev/null +++ b/apps/RockApp/eslint.config.mjs @@ -0,0 +1,4 @@ +import eslintRnConfig from '../../eslint.config.rn.mjs'; + +/** @type {import('eslint').Linter.Config[]} */ +export default eslintRnConfig; diff --git a/apps/RockApp/index.js b/apps/RockApp/index.js new file mode 100644 index 000000000..ed6658ae3 --- /dev/null +++ b/apps/RockApp/index.js @@ -0,0 +1,10 @@ +/** + * @format + */ +import './BrownfieldStore.brownie'; + +import { App } from '@callstack/brownfield-example-shared'; +import { AppRegistry } from 'react-native'; +import { name as appName } from './app.json'; + +AppRegistry.registerComponent(appName, () => App); diff --git a/apps/RockApp/ios/.xcode.env b/apps/RockApp/ios/.xcode.env new file mode 100644 index 000000000..3d5782c71 --- /dev/null +++ b/apps/RockApp/ios/.xcode.env @@ -0,0 +1,11 @@ +# This `.xcode.env` file is versioned and is used to source the environment +# used when running script phases inside Xcode. +# To customize your local environment, you can create an `.xcode.env.local` +# file that is not versioned. + +# NODE_BINARY variable contains the PATH to the node executable. +# +# Customize the NODE_BINARY variable here. +# For example, to use nvm with brew, add the following line +# . "$(brew --prefix nvm)/nvm.sh" --no-use +export NODE_BINARY=$(command -v node) diff --git a/apps/RockApp/ios/BrownfieldLib/BrownfieldLib.h b/apps/RockApp/ios/BrownfieldLib/BrownfieldLib.h new file mode 100644 index 000000000..d52a5799b --- /dev/null +++ b/apps/RockApp/ios/BrownfieldLib/BrownfieldLib.h @@ -0,0 +1,9 @@ +#import + +//! Project version number for BrownfieldLib. +FOUNDATION_EXPORT double BrownfieldLibVersionNumber; + +//! Project version string for BrownfieldLib. +FOUNDATION_EXPORT const unsigned char BrownfieldLibVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import diff --git a/apps/RockApp/ios/BrownfieldLib/BrownfieldLib.swift b/apps/RockApp/ios/BrownfieldLib/BrownfieldLib.swift new file mode 100644 index 000000000..961ee202e --- /dev/null +++ b/apps/RockApp/ios/BrownfieldLib/BrownfieldLib.swift @@ -0,0 +1,5 @@ +@_exported import ReactBrownfield + +public let ReactNativeBundle = Bundle(for: DummyClass.self) + +class DummyClass {} diff --git a/apps/RockApp/ios/Podfile b/apps/RockApp/ios/Podfile new file mode 100644 index 000000000..dfc2390af --- /dev/null +++ b/apps/RockApp/ios/Podfile @@ -0,0 +1,40 @@ +# Resolve react_native_pods.rb with node to allow for hoisting +require Pod::Executable.execute_command('node', ['-p', + 'require.resolve( + "react-native/scripts/react_native_pods.rb", + {paths: [process.argv[1]]}, + )', __dir__]).strip + +platform :ios, min_ios_version_supported +prepare_react_native_project! + +linkage = ENV['USE_FRAMEWORKS'] +if linkage != nil + Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green + use_frameworks! :linkage => linkage.to_sym +else + use_frameworks! :linkage => :static +end + +target 'RockApp' do + config = use_native_modules!(['npx', 'rock', 'config', '-p', 'ios']) + + use_react_native!( + :path => config[:reactNativePath], + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/.." + ) + + target 'BrownfieldLib' do + inherit! :complete + end + + post_install do |installer| + react_native_post_install( + installer, + config[:reactNativePath], + :mac_catalyst_enabled => false, + # :ccache_enabled => true + ) + end +end diff --git a/apps/RockApp/ios/Podfile.lock b/apps/RockApp/ios/Podfile.lock new file mode 100644 index 000000000..f79fb38c1 --- /dev/null +++ b/apps/RockApp/ios/Podfile.lock @@ -0,0 +1,2166 @@ +PODS: + - boost (1.84.0): + - ReactNativeDependencies + - BrownfieldNavigation (6.0.1): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - Brownie (6.0.1): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - DoubleConversion (1.1.6): + - ReactNativeDependencies + - fast_float (8.0.0): + - ReactNativeDependencies + - FBLazyVector (0.87.0): + - React-Core-prebuilt + - fmt (12.1.0): + - ReactNativeDependencies + - glog (0.3.5): + - ReactNativeDependencies + - hermes-engine (250829098.0.16): + - hermes-engine/Pre-built (= 250829098.0.16) + - hermes-engine/Pre-built (250829098.0.16) + - RCT-Folly (2024.11.18.00): + - RCT-Folly/Default (= 2024.11.18.00) + - ReactNativeDependencies + - RCT-Folly/Default (2024.11.18.00): + - ReactNativeDependencies + - RCTDeprecation (0.87.0): + - React-Core-prebuilt + - RCTRequired (0.87.0): + - React-Core-prebuilt + - RCTSwiftUI (0.87.0) + - RCTSwiftUIWrapper (0.87.0): + - RCTSwiftUI + - RCTTypeSafety (0.87.0): + - FBLazyVector (= 0.87.0) + - RCTRequired (= 0.87.0) + - React-Core (= 0.87.0) + - React (0.87.0): + - React-Core (= 0.87.0) + - React-Core/DevSupport (= 0.87.0) + - React-Core/RCTWebSocket (= 0.87.0) + - React-RCTActionSheet (= 0.87.0) + - React-RCTAnimation (= 0.87.0) + - React-RCTBlob (= 0.87.0) + - React-RCTImage (= 0.87.0) + - React-RCTLinking (= 0.87.0) + - React-RCTNetwork (= 0.87.0) + - React-RCTSettings (= 0.87.0) + - React-RCTText (= 0.87.0) + - React-RCTVibration (= 0.87.0) + - React-bridging (0.87.0): + - React-callinvoker + - React-Core-prebuilt + - React-jsi + - React-timing + - ReactNativeDependencies + - React-callinvoker (0.87.0) + - React-Core (0.87.0): + - React-Core-prebuilt + - React-Core/Default (= 0.87.0) + - React-Core-prebuilt (0.87.0): + - ReactNativeDependencies + - React-Core/CoreModulesHeaders (0.87.0): + - React-Core-prebuilt + - React-Core/Default (0.87.0): + - React-Core-prebuilt + - React-Core/DevSupport (0.87.0): + - React-Core-prebuilt + - React-Core/RCTActionSheetHeaders (0.87.0): + - React-Core-prebuilt + - React-Core/RCTAnimationHeaders (0.87.0): + - React-Core-prebuilt + - React-Core/RCTBlobHeaders (0.87.0): + - React-Core-prebuilt + - React-Core/RCTImageHeaders (0.87.0): + - React-Core-prebuilt + - React-Core/RCTLinkingHeaders (0.87.0): + - React-Core-prebuilt + - React-Core/RCTNetworkHeaders (0.87.0): + - React-Core-prebuilt + - React-Core/RCTSettingsHeaders (0.87.0): + - React-Core-prebuilt + - React-Core/RCTTextHeaders (0.87.0): + - React-Core-prebuilt + - React-Core/RCTVibrationHeaders (0.87.0): + - React-Core-prebuilt + - React-Core/RCTWebSocket (0.87.0): + - React-Core-prebuilt + - React-CoreModules (0.87.0): + - RCTTypeSafety (= 0.87.0) + - React-Core-prebuilt + - React-Core/CoreModulesHeaders (= 0.87.0) + - React-debug + - React-featureflags + - React-jsi (= 0.87.0) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-NativeModulesApple + - React-RCTBlob + - React-RCTFBReactNativeSpec + - React-RCTImage (= 0.87.0) + - React-runtimeexecutor + - React-utils + - ReactCommon + - ReactNativeDependencies + - React-cxxreact (0.87.0): + - hermes-engine + - React-callinvoker (= 0.87.0) + - React-Core-prebuilt + - React-debug (= 0.87.0) + - React-jserrorhandler (= 0.87.0) + - React-jsi (= 0.87.0) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-logger (= 0.87.0) + - React-perflogger (= 0.87.0) + - React-runtimeexecutor + - React-timing (= 0.87.0) + - React-utils + - ReactNativeDependencies + - React-cxxstableapi (0.87.0) + - React-debug (0.87.0): + - React-debug/redbox (= 0.87.0) + - React-debug/redbox (0.87.0) + - React-defaultsnativemodule (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-domnativemodule + - React-Fabric/animated + - React-featureflags + - React-featureflagsnativemodule + - React-idlecallbacksnativemodule + - React-intersectionobservernativemodule + - React-jsi + - React-jsiexecutor + - React-microtasksnativemodule + - React-mutationobservernativemodule + - React-RCTFBReactNativeSpec + - React-viewtransitionnativemodule + - React-webperformancenativemodule + - ReactNativeDependencies + - Yoga + - React-domnativemodule (0.87.0): + - hermes-engine + - React-bridging + - React-Core-prebuilt + - React-Fabric + - React-Fabric/bridging + - React-FabricComponents + - React-graphics + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-Fabric (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric/animated (= 0.87.0) + - React-Fabric/animationbackend (= 0.87.0) + - React-Fabric/animations (= 0.87.0) + - React-Fabric/attributedstring (= 0.87.0) + - React-Fabric/bridging (= 0.87.0) + - React-Fabric/componentregistry (= 0.87.0) + - React-Fabric/componentregistrynative (= 0.87.0) + - React-Fabric/components (= 0.87.0) + - React-Fabric/consistency (= 0.87.0) + - React-Fabric/core (= 0.87.0) + - React-Fabric/dom (= 0.87.0) + - React-Fabric/imagemanager (= 0.87.0) + - React-Fabric/leakchecker (= 0.87.0) + - React-Fabric/mounting (= 0.87.0) + - React-Fabric/observers (= 0.87.0) + - React-Fabric/scheduler (= 0.87.0) + - React-Fabric/telemetry (= 0.87.0) + - React-Fabric/uimanager (= 0.87.0) + - React-Fabric/viewtransition (= 0.87.0) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/animated (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric/animationbackend + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/animationbackend (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/animations (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/attributedstring (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/bridging (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/componentregistry (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/componentregistrynative (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.87.0) + - React-Fabric/components/root (= 0.87.0) + - React-Fabric/components/scrollview (= 0.87.0) + - React-Fabric/components/view (= 0.87.0) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components/legacyviewmanagerinterop (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components/root (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components/scrollview (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components/view (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-renderercss + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-Fabric/consistency (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/core (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/dom (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/imagemanager (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/leakchecker (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/mounting (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-jsinspectortracing + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/observers (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.87.0) + - React-Fabric/observers/intersection (= 0.87.0) + - React-Fabric/observers/mutation (= 0.87.0) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/observers/events (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/observers/intersection (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/observers/mutation (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/scheduler (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric/animationbackend + - React-Fabric/observers/events + - React-Fabric/viewtransition + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancecdpmetrics + - React-performancetimeline + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/telemetry (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/uimanager (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.87.0) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/uimanager/consistency (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/viewtransition (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-FabricComponents (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.87.0) + - React-FabricComponents/textlayoutmanager (= 0.87.0) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.87.0) + - React-FabricComponents/components/iostextinput (= 0.87.0) + - React-FabricComponents/components/modal (= 0.87.0) + - React-FabricComponents/components/rncore (= 0.87.0) + - React-FabricComponents/components/safeareaview (= 0.87.0) + - React-FabricComponents/components/scrollview (= 0.87.0) + - React-FabricComponents/components/switch (= 0.87.0) + - React-FabricComponents/components/text (= 0.87.0) + - React-FabricComponents/components/textinput (= 0.87.0) + - React-FabricComponents/components/unimplementedview (= 0.87.0) + - React-FabricComponents/components/virtualview (= 0.87.0) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/inputaccessory (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/iostextinput (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/modal (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/rncore (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/safeareaview (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/scrollview (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/switch (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/text (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/textinput (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/unimplementedview (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/virtualview (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/textlayoutmanager (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricImage (0.87.0): + - hermes-engine + - RCTRequired (= 0.87.0) + - RCTTypeSafety (= 0.87.0) + - React-Core-prebuilt + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsiexecutor (= 0.87.0) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - ReactNativeDependencies + - Yoga + - React-featureflags (0.87.0): + - React-Core-prebuilt + - ReactNativeDependencies + - React-featureflagsnativemodule (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-featureflags + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-graphics (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-featureflags + - React-jsi + - React-jsiexecutor + - React-rendererdebug + - React-utils + - ReactNativeDependencies + - React-hermes (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-cxxreact (= 0.87.0) + - React-jsi + - React-jsiexecutor (= 0.87.0) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-oscompat + - React-perflogger (= 0.87.0) + - React-runtimeexecutor + - ReactNativeDependencies + - React-idlecallbacksnativemodule (0.87.0): + - hermes-engine + - React-bridging + - React-Core-prebuilt + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-ImageManager (0.87.0): + - React-Core-prebuilt + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - ReactNativeDependencies + - React-intersectionobservernativemodule (0.87.0): + - hermes-engine + - React-bridging + - React-Core-prebuilt + - React-cxxreact + - React-Fabric + - React-Fabric/bridging + - React-graphics + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-jserrorhandler (0.87.0): + - hermes-engine + - React-bridging + - React-Core-prebuilt + - React-debug + - React-featureflags + - React-jsi + - ReactNativeDependencies + - React-jsi (0.87.0): + - hermes-engine + - React-Core-prebuilt + - ReactNativeDependencies + - React-jsiexecutor (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-jserrorhandler + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-utils + - ReactNativeDependencies + - React-jsinspector (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-oscompat + - React-perflogger (= 0.87.0) + - React-runtimeexecutor + - React-utils + - ReactNativeDependencies + - React-jsinspectorcdp (0.87.0): + - React-Core-prebuilt + - ReactNativeDependencies + - React-jsinspectornetwork (0.87.0): + - React-Core-prebuilt + - React-jsinspectorcdp + - ReactNativeDependencies + - React-jsinspectortracing (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-jsi + - React-jsinspectornetwork + - React-oscompat + - React-timing + - React-utils + - ReactNativeDependencies + - React-jsitooling (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-cxxreact (= 0.87.0) + - React-debug + - React-jsi (= 0.87.0) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-runtimeexecutor + - React-utils + - ReactNativeDependencies + - React-jsitracing (0.87.0): + - React-jsi + - React-logger (0.87.0): + - React-Core-prebuilt + - ReactNativeDependencies + - React-Mapbuffer (0.87.0): + - React-Core-prebuilt + - React-debug + - ReactNativeDependencies + - React-microtasksnativemodule (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-mutationobservernativemodule (0.87.0): + - hermes-engine + - React-bridging + - React-Core-prebuilt + - React-cxxreact + - React-Fabric + - React-Fabric/bridging + - React-Fabric/observers/mutation + - React-featureflags + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - react-native-safe-area-context (5.9.1): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common (= 5.9.1) + - react-native-safe-area-context/fabric (= 5.9.1) + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - react-native-safe-area-context/common (5.9.1): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - react-native-safe-area-context/fabric (5.9.1): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-NativeModulesApple (0.87.0): + - hermes-engine + - React-bridging + - React-callinvoker + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-networking (0.87.0): + - React-Core-prebuilt + - React-jsinspectornetwork + - React-jsinspectortracing + - React-performancetimeline + - React-timing + - ReactNativeDependencies + - React-oscompat (0.87.0) + - React-perflogger (0.87.0): + - React-Core-prebuilt + - ReactNativeDependencies + - React-performancecdpmetrics (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-jsi + - React-performancetimeline + - React-runtimeexecutor + - React-timing + - ReactNativeDependencies + - React-performancetimeline (0.87.0): + - React-Core-prebuilt + - React-featureflags + - React-jsinspector + - React-jsinspectortracing + - React-perflogger + - React-timing + - ReactNativeDependencies + - React-RCTActionSheet (0.87.0): + - React-Core/RCTActionSheetHeaders (= 0.87.0) + - React-RCTAnimatedModuleProvider (0.87.0): + - hermes-engine + - React-Core + - React-Core-prebuilt + - React-Fabric/animated + - React-featureflags + - ReactCommon + - ReactNativeDependencies + - Yoga + - React-RCTAnimation (0.87.0): + - RCTTypeSafety + - React-Core-prebuilt + - React-Core/RCTAnimationHeaders + - React-debug + - React-featureflags + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - ReactNativeDependencies + - React-RCTAppDelegate (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsitooling + - React-NativeModulesApple + - React-RCTAnimatedModuleProvider + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTNetwork + - React-RCTRuntime + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon + - ReactNativeDependencies + - React-RCTBlob (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - ReactNativeDependencies + - React-RCTFabric (0.87.0): + - React-Core-prebuilt + - React-RCTFBReactNativeSpec (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec/components (= 0.87.0) + - ReactCommon + - ReactNativeDependencies + - React-RCTFBReactNativeSpec/components (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon + - ReactNativeDependencies + - Yoga + - React-RCTImage (0.87.0): + - RCTTypeSafety + - React-Core-prebuilt + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - ReactNativeDependencies + - React-RCTLinking (0.87.0): + - React-Core/RCTLinkingHeaders (= 0.87.0) + - React-jsi (= 0.87.0) + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - ReactCommon/turbomodule/core (= 0.87.0) + - React-RCTNetwork (0.87.0): + - RCTTypeSafety + - React-Core-prebuilt + - React-Core/RCTNetworkHeaders + - React-debug + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-NativeModulesApple + - React-networking + - React-RCTFBReactNativeSpec + - ReactCommon + - ReactNativeDependencies + - React-RCTRuntime (0.87.0): + - React-Core-prebuilt + - React-RCTSettings (0.87.0): + - RCTTypeSafety + - React-Core-prebuilt + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - ReactNativeDependencies + - React-RCTText (0.87.0): + - React-Core/RCTTextHeaders (= 0.87.0) + - Yoga + - React-RCTVibration (0.87.0): + - React-Core-prebuilt + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - ReactNativeDependencies + - React-rendererconsistency (0.87.0) + - React-renderercss (0.87.0): + - React-debug + - React-utils + - React-rendererdebug (0.87.0): + - React-Core-prebuilt + - React-debug + - ReactNativeDependencies + - React-RuntimeApple (0.87.0): + - hermes-engine + - React-callinvoker + - React-Core-prebuilt + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - React-RuntimeCore (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-cxxreact + - React-Fabric + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-performancetimeline + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactNativeDependencies + - React-runtimeexecutor (0.87.0): + - React-Core-prebuilt + - React-debug + - React-featureflags + - React-jsi (= 0.87.0) + - React-utils + - ReactNativeDependencies + - React-RuntimeHermes (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-jsitracing + - React-RuntimeCore + - React-runtimeexecutor + - React-utils + - ReactNativeDependencies + - React-runtimescheduler (0.87.0): + - hermes-engine + - React-callinvoker + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsinspectortracing + - React-performancetimeline + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-timing + - React-utils + - ReactNativeDependencies + - React-timing (0.87.0): + - React-debug + - React-utils (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-debug + - React-jsi (= 0.87.0) + - ReactNativeDependencies + - React-viewtransitionnativemodule (0.87.0): + - hermes-engine + - React-Core-prebuilt + - React-Fabric + - React-Fabric/bridging + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-webperformancenativemodule (0.87.0): + - hermes-engine + - React-bridging + - React-Core-prebuilt + - React-cxxreact + - React-jsi + - React-jsiexecutor + - React-performancetimeline + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - ReactAppDependencyProvider (0.87.0): + - ReactCodegen + - ReactBrownfield (6.0.1): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - ReactCodegen (0.87.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-RCTAppDelegate + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - ReactCommon (0.87.0): + - React-Core-prebuilt + - ReactCommon/turbomodule (= 0.87.0) + - ReactNativeDependencies + - ReactCommon/turbomodule (0.87.0): + - hermes-engine + - React-callinvoker (= 0.87.0) + - React-Core-prebuilt + - React-jsi (= 0.87.0) + - React-logger (= 0.87.0) + - React-perflogger (= 0.87.0) + - ReactCommon/turbomodule/core (= 0.87.0) + - ReactNativeDependencies + - ReactCommon/turbomodule/core (0.87.0): + - hermes-engine + - React-bridging + - React-callinvoker (= 0.87.0) + - React-Core-prebuilt + - React-cxxreact (= 0.87.0) + - React-debug (= 0.87.0) + - React-featureflags (= 0.87.0) + - React-jsi (= 0.87.0) + - React-logger (= 0.87.0) + - React-perflogger (= 0.87.0) + - React-utils (= 0.87.0) + - ReactNativeDependencies + - ReactNativeDependencies (0.87.0) + - RNScreens (4.27.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - RNScreens/common (= 4.27.0) + - Yoga + - RNScreens/common (4.27.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - SocketRocket (0.7.1): + - ReactNativeDependencies + - Yoga (0.0.0): + - React-Core-prebuilt + +DEPENDENCIES: + - boost (from `build/rndeps-facades/boost`) + - "BrownfieldNavigation (from `../node_modules/@callstack/brownfield-navigation`)" + - "Brownie (from `../node_modules/@callstack/brownie`)" + - DoubleConversion (from `build/rndeps-facades/DoubleConversion`) + - fast_float (from `build/rndeps-facades/fast_float`) + - FBLazyVector (from `build/rncore-facades/FBLazyVector`) + - fmt (from `build/rndeps-facades/fmt`) + - glog (from `build/rndeps-facades/glog`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - RCT-Folly (from `build/rndeps-facades/RCT-Folly`) + - RCTDeprecation (from `build/rncore-facades/RCTDeprecation`) + - RCTRequired (from `build/rncore-facades/RCTRequired`) + - RCTSwiftUI (from `../node_modules/react-native/ReactApple/RCTSwiftUI`) + - RCTSwiftUIWrapper (from `../node_modules/react-native/ReactApple/RCTSwiftUIWrapper`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-bridging (from `../node_modules/react-native/ReactCommon/react/bridging`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Core (from `build/rncore-facades/React-Core`) + - React-Core-prebuilt (from `../node_modules/react-native/React-Core-prebuilt.podspec`) + - React-Core/RCTWebSocket (from `build/rncore-facades/React-Core`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-cxxstableapi (from `../node_modules/react-native/ReactCommon/react/cxxstableapi`) + - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) + - React-Fabric (from `../node_modules/react-native/ReactCommon`) + - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) + - React-FabricImage (from `../node_modules/react-native/ReactCommon`) + - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) + - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) + - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-intersectionobservernativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/intersectionobserver`) + - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsinspectorcdp (from `../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`) + - React-jsinspectornetwork (from `../node_modules/react-native/ReactCommon/jsinspector-modern/network`) + - React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) + - React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`) + - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) + - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) + - React-mutationobservernativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/mutationobserver`) + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-networking (from `../node_modules/react-native/ReactCommon/react/networking`) + - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancecdpmetrics (from `../node_modules/react-native/ReactCommon/react/performance/cdpmetrics`) + - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimatedModuleProvider (from `../node_modules/react-native/ReactApple/RCTAnimatedModuleProvider`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTFabric (from `build/rncore-facades/React-RCTFabric`) + - React-RCTFBReactNativeSpec (from `../node_modules/react-native/React`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTRuntime (from `build/rncore-facades/React-RCTRuntime`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`) + - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) + - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) + - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - React-viewtransitionnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/viewtransition`) + - React-webperformancenativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/webperformance`) + - ReactAppDependencyProvider (from `build/generated/ios/ReactAppDependencyProvider`) + - "ReactBrownfield (from `../node_modules/@callstack/react-native-brownfield`)" + - ReactCodegen (from `build/generated/ios/ReactCodegen`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - ReactNativeDependencies (from `../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`) + - RNScreens (from `../node_modules/react-native-screens`) + - SocketRocket (from `build/rndeps-facades/SocketRocket`) + - Yoga (from `build/rncore-facades/Yoga`) + +EXTERNAL SOURCES: + boost: + :path: build/rndeps-facades/boost + BrownfieldNavigation: + :path: "../node_modules/@callstack/brownfield-navigation" + Brownie: + :path: "../node_modules/@callstack/brownie" + DoubleConversion: + :path: build/rndeps-facades/DoubleConversion + fast_float: + :path: build/rndeps-facades/fast_float + FBLazyVector: + :path: build/rncore-facades/FBLazyVector + fmt: + :path: build/rndeps-facades/fmt + glog: + :path: build/rndeps-facades/glog + hermes-engine: + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-v250829098.0.16 + RCT-Folly: + :path: build/rndeps-facades/RCT-Folly + RCTDeprecation: + :path: build/rncore-facades/RCTDeprecation + RCTRequired: + :path: build/rncore-facades/RCTRequired + RCTSwiftUI: + :path: "../node_modules/react-native/ReactApple/RCTSwiftUI" + RCTSwiftUIWrapper: + :path: "../node_modules/react-native/ReactApple/RCTSwiftUIWrapper" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-bridging: + :path: "../node_modules/react-native/ReactCommon/react/bridging" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Core: + :path: build/rncore-facades/React-Core + React-Core-prebuilt: + :podspec: "../node_modules/react-native/React-Core-prebuilt.podspec" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-cxxstableapi: + :path: "../node_modules/react-native/ReactCommon/react/cxxstableapi" + React-debug: + :path: "../node_modules/react-native/ReactCommon/react/debug" + React-defaultsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + React-domnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" + React-Fabric: + :path: "../node_modules/react-native/ReactCommon" + React-FabricComponents: + :path: "../node_modules/react-native/ReactCommon" + React-FabricImage: + :path: "../node_modules/react-native/ReactCommon" + React-featureflags: + :path: "../node_modules/react-native/ReactCommon/react/featureflags" + React-featureflagsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + React-graphics: + :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" + React-idlecallbacksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + React-ImageManager: + :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-intersectionobservernativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/intersectionobserver" + React-jserrorhandler: + :path: "../node_modules/react-native/ReactCommon/jserrorhandler" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsinspectorcdp: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + React-jsinspectornetwork: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network" + React-jsinspectortracing: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + React-jsitooling: + :path: "../node_modules/react-native/ReactCommon/jsitooling" + React-jsitracing: + :path: "../node_modules/react-native/ReactCommon/hermes/executor/" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + React-Mapbuffer: + :path: "../node_modules/react-native/ReactCommon" + React-microtasksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + React-mutationobservernativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/mutationobserver" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" + React-NativeModulesApple: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-networking: + :path: "../node_modules/react-native/ReactCommon/react/networking" + React-oscompat: + :path: "../node_modules/react-native/ReactCommon/oscompat" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-performancecdpmetrics: + :path: "../node_modules/react-native/ReactCommon/react/performance/cdpmetrics" + React-performancetimeline: + :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimatedModuleProvider: + :path: "../node_modules/react-native/ReactApple/RCTAnimatedModuleProvider" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../node_modules/react-native/Libraries/AppDelegate" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTFabric: + :path: build/rncore-facades/React-RCTFabric + React-RCTFBReactNativeSpec: + :path: "../node_modules/react-native/React" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTRuntime: + :path: build/rncore-facades/React-RCTRuntime + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-rendererconsistency: + :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + React-renderercss: + :path: "../node_modules/react-native/ReactCommon/react/renderer/css" + React-rendererdebug: + :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" + React-RuntimeApple: + :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimescheduler: + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-timing: + :path: "../node_modules/react-native/ReactCommon/react/timing" + React-utils: + :path: "../node_modules/react-native/ReactCommon/react/utils" + React-viewtransitionnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/viewtransition" + React-webperformancenativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/webperformance" + ReactAppDependencyProvider: + :path: build/generated/ios/ReactAppDependencyProvider + ReactBrownfield: + :path: "../node_modules/@callstack/react-native-brownfield" + ReactCodegen: + :path: build/generated/ios/ReactCodegen + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + ReactNativeDependencies: + :podspec: "../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec" + RNScreens: + :path: "../node_modules/react-native-screens" + SocketRocket: + :path: build/rndeps-facades/SocketRocket + Yoga: + :path: build/rncore-facades/Yoga + +SPEC CHECKSUMS: + boost: 8502bfdc46e2804408af2e163049ece181009af4 + BrownfieldNavigation: 1c81b1e8646e0e93b79d71e62238e6cd1dfd6694 + Brownie: 3d0437c195c2ea0e3592e89fc98694b4b247fffc + DoubleConversion: 501a575c40c0b50c89685762dd3e415e6bb26fb0 + fast_float: 7c925d1cebf8328d4018d061f49377e9f887e3b4 + FBLazyVector: 732df79fea96f10cc14477969cea05707026d2fd + fmt: ba0886e864ebb21d14c98b2e12e164b8002f5b93 + glog: 3cf7cb46f743c4bc758ae3e6d9c15bd1b4cfd6d4 + hermes-engine: 6a26e94b4a974cbadc751eed9caa12624c38f226 + RCT-Folly: 82921e585c0400eda46fac1068297aa9dfb035e4 + RCTDeprecation: 6d66040b74f4be203495adda55b49c1a25190291 + RCTRequired: ebf172e0b04196922ba4640458f9926c1bb34012 + RCTSwiftUI: ac8537fe21f096259c91bd663655ff52ec864cb0 + RCTSwiftUIWrapper: 64406e4d42af802b3baf2fbaa0bd8ad75bc0cc9b + RCTTypeSafety: 80eac4783ed394cdffb5981d2c99b73a1bc519ca + React: 41924a5bad9466fe869b4511650b7d6e0cf02c84 + React-bridging: 02db3b5ad985a0ff729c20c74349a29b511507a0 + React-callinvoker: 2703817f9ad45a19f839421aa77a3504b2a76f0d + React-Core: 7b2c3d5cc62d50659ba1c0c86b9112a3b44c1219 + React-Core-prebuilt: 508793fe2a734c137e80b894998702a6fe7caa94 + React-CoreModules: f940b6c1451d74b19d340aa52612eb7e9a306d95 + React-cxxreact: cf37497363d74b6a766fb06e8feb96dc8156f471 + React-cxxstableapi: 912021758ac453cfa5d83a6c525712dda4782847 + React-debug: 1925c8216471fb347ba613f89b791887131d4968 + React-defaultsnativemodule: f05dc714a4406f74c0d9889e86f677da73f7fae2 + React-domnativemodule: 5d2b0fc8c1ff9ac7ecb3ec3b80ce1d5b428ea56c + React-Fabric: c606cc2c9c17fd2a4324a5f7f8580270bc2e41ac + React-FabricComponents: b91d325fa8b293bf8fccf05502c87f5adc296cb6 + React-FabricImage: cdb9f5bba3be493e9bc46292a20edce22eb0779f + React-featureflags: 90fda5d3e4330160828e682d1a6dfc78b7a36f33 + React-featureflagsnativemodule: c51aa918034fd0739117baaf00434d0950b39673 + React-graphics: fa1172e102ce117e535a194f9876199e6e7f8fdf + React-hermes: 8cbf3f3ca711b7ab1724fe25ec4f2a0d86c9abe6 + React-idlecallbacksnativemodule: 845fd7655c5187c68f51affafb26ed5398978bdc + React-ImageManager: ad49eff074b600bc772b2a2ead00feaa7f1f0581 + React-intersectionobservernativemodule: 6af306d14be72655ad624648f757ebd41930aa32 + React-jserrorhandler: 863cda77bda575f0a7f97a18085e40a3f385aa89 + React-jsi: 14ad6fae949e154da5b81d27692298ebd49a8a34 + React-jsiexecutor: 9e59ba557dbe7197ec5c87e6685a2082964ef14c + React-jsinspector: 980659da8ce50cd04b91d50e668bc8144ca4bee3 + React-jsinspectorcdp: a95858a321a9f0123635920971ee203756f84a4b + React-jsinspectornetwork: dd95a42f61b70a10e4d2821c4ac6c4e82654d614 + React-jsinspectortracing: 8ebf04f02ea5e061aa338eab0bd8ee35b437c68b + React-jsitooling: 0934cf307ef95267f182b40d258f10f9d706abaf + React-jsitracing: 2ce502324a7718d1be54823589fbfd0f894dfd64 + React-logger: f280101234b7e8df003e99ff4d359dc57de77117 + React-Mapbuffer: 890e1f677fd1e49f9114440fb17de61b53eb8db1 + React-microtasksnativemodule: 5adac537604494606f0d2121a3c966356eb42cbb + React-mutationobservernativemodule: 44fd38a55451f25ea5a2c74e74f18bf08f94d40a + react-native-safe-area-context: 276e80a088fdae79726b2df0ebba55e7a4fecce4 + React-NativeModulesApple: 22b2f3e1538ceb1aab1ab182ccb0666ea2ec36ad + React-networking: b007a80590c11f2ce62a4967386c594a434a83cb + React-oscompat: 72573ceb65b6c6c6bc34e51e0df8f44c91081a6d + React-perflogger: 885850f7ee01af5e47cfb7e51eb9f3e10ab0c9da + React-performancecdpmetrics: ba5a94088f6a1ae13bae2ac74fd6ee210c938af5 + React-performancetimeline: 0aa93dd28bff8b1259916e23f57939cbe8974da5 + React-RCTActionSheet: a88d0f7eb5738ec418a2ff1984439a6924662b2c + React-RCTAnimatedModuleProvider: 7af9d8aaac99a3442b3d795fb04056e8d780b974 + React-RCTAnimation: 5314c78f58d3018eb47026ef26f116d9e126d5ed + React-RCTAppDelegate: d048873b1e0145204137ebd14e5d3d8577a76672 + React-RCTBlob: ba1b169851e00249af27f946cb4ae27eba65f133 + React-RCTFabric: f8302793314697ae59e037fd16578979f9a72d44 + React-RCTFBReactNativeSpec: e6c6473f8ab6eb646c4dd4353956e9b1768e99b8 + React-RCTImage: e159826f6c49e8bc282a73410c68de2e83456b98 + React-RCTLinking: 7adcbc80b056e382a5346d9cda1509c97a9f6f69 + React-RCTNetwork: 4106de28a9c4cc6f4664a5829f2b56e8d67d45b4 + React-RCTRuntime: f2eeab7e701c16153dd86f5b78b9aa6e613dc3b0 + React-RCTSettings: 0ce8009ed2db69ea9f1900c6578831c23fa88c77 + React-RCTText: 901788b3060e912a6893e24cdbdc0f504895d215 + React-RCTVibration: 8ace21ea22b677d4bef389d43d7b2f0b87ec147f + React-rendererconsistency: 3da45e68ab9f4d23f9c25a015968cd8452f3bc0b + React-renderercss: c81b495b42c27d68646557bebbe0838887bd563a + React-rendererdebug: 7f6ccdf375c63722d6514e93dec8aa40d28bb5e3 + React-RuntimeApple: 2cd58a69b481765c998fd7effd089bec71801f11 + React-RuntimeCore: f47d64cdd380dfb708e4d116a3937bb2ce95cb58 + React-runtimeexecutor: 207d060a187422b6d27107a20028da167d0c3d37 + React-RuntimeHermes: e0211d52adae396b696e7e2ebce67b0d10736108 + React-runtimescheduler: b19728d726691ce0049e571fa2823053097bff7f + React-timing: 069339825629b0a604e9833dfb58e7eb06680a4a + React-utils: edc3dcabc91cce412b2f540ce061a8a811baa4b0 + React-viewtransitionnativemodule: 9e3d0ecfe85e264d6a9b77c1cc3284a6606a8102 + React-webperformancenativemodule: 9f363c62029fb104edd9c488226936c64d842114 + ReactAppDependencyProvider: ed5609dc8e30eeade35ba8e43128781ee8fdf4de + ReactBrownfield: 17055d74d75cec5e7ba546f1ba21861394c5f9eb + ReactCodegen: 4c799b1a7c20e188310302f1df58a8c1305a21e5 + ReactCommon: 5f5a302748322015f2e3334869cdd9b4d0395846 + ReactNativeDependencies: ec5530432d8191b38e278117d498aaff05ea9d6f + RNScreens: 9964f9126ccea33c2c18cfe3dc0398ff7c917056 + SocketRocket: 37aec555668fb852ec12e3c0de59a86ca58f0871 + Yoga: d1c536142c5ff8ec8cd856ab2a7c227a1d875c8e + +PODFILE CHECKSUM: 8223041cbc6e51ae5b46743c66fb8baa9ffecd90 + +COCOAPODS: 1.15.2 diff --git a/apps/RockApp/ios/Podfile.properties.json b/apps/RockApp/ios/Podfile.properties.json new file mode 100644 index 000000000..0d1c6413d --- /dev/null +++ b/apps/RockApp/ios/Podfile.properties.json @@ -0,0 +1,3 @@ +{ + "expo.jsEngine": "hermes" + } \ No newline at end of file diff --git a/apps/RockApp/ios/RockApp.xcodeproj/project.pbxproj b/apps/RockApp/ios/RockApp.xcodeproj/project.pbxproj new file mode 100644 index 000000000..13dcc07f3 --- /dev/null +++ b/apps/RockApp/ios/RockApp.xcodeproj/project.pbxproj @@ -0,0 +1,786 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 13B07FBC1A68108700A75B9A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.swift */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 20D164A02D4D80800039A91E /* BrownfieldLib.h in Headers */ = {isa = PBXBuildFile; fileRef = 20D1649E2D4D80800039A91E /* BrownfieldLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 20D164A22D4D80990039A91E /* BrownfieldLib.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D164A12D4D80950039A91E /* BrownfieldLib.swift */; }; + 353901B400D276BB7AB683D8 /* Pods_RockApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C853E0A265E8A672EB24A8DE /* Pods_RockApp.framework */; }; + 546D46CF8CF3A0DA1BFADB0D /* Pods_RockApp_BrownfieldLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A7CC4F5D544D927A8127D5A /* Pods_RockApp_BrownfieldLib.framework */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; + B16C603D25A2E5456D38112F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 13B07F961A680F5B00A75B9A /* RockApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RockApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FB01A68108700A75B9A /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = RockApp/AppDelegate.swift; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RockApp/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RockApp/Info.plist; sourceTree = ""; }; + 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = RockApp/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 20D1648D2D4D7FAF0039A91E /* BrownfieldLib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BrownfieldLib.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 20D1649E2D4D80800039A91E /* BrownfieldLib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BrownfieldLib.h; sourceTree = ""; }; + 20D164A12D4D80950039A91E /* BrownfieldLib.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrownfieldLib.swift; sourceTree = ""; }; + 25056119C0BDA4CDB86B24D9 /* Pods-RockApp-BrownfieldLib.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RockApp-BrownfieldLib.release.xcconfig"; path = "Target Support Files/Pods-RockApp-BrownfieldLib/Pods-RockApp-BrownfieldLib.release.xcconfig"; sourceTree = ""; }; + 3B4392A12AC88292D35C810B /* Pods-RockApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RockApp.debug.xcconfig"; path = "Target Support Files/Pods-RockApp/Pods-RockApp.debug.xcconfig"; sourceTree = ""; }; + 4A7CC4F5D544D927A8127D5A /* Pods_RockApp_BrownfieldLib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RockApp_BrownfieldLib.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4D838915DF00B87281042637 /* Pods-RockApp-BrownfieldLib.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RockApp-BrownfieldLib.debug.xcconfig"; path = "Target Support Files/Pods-RockApp-BrownfieldLib/Pods-RockApp-BrownfieldLib.debug.xcconfig"; sourceTree = ""; }; + 5709B34CF0A7D63546082F79 /* Pods-RockApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RockApp.release.xcconfig"; path = "Target Support Files/Pods-RockApp/Pods-RockApp.release.xcconfig"; sourceTree = ""; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = RockApp/LaunchScreen.storyboard; sourceTree = ""; }; + C853E0A265E8A672EB24A8DE /* Pods_RockApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RockApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 353901B400D276BB7AB683D8 /* Pods_RockApp.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 20D1648A2D4D7FAF0039A91E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 546D46CF8CF3A0DA1BFADB0D /* Pods_RockApp_BrownfieldLib.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13B07FAE1A68108700A75B9A /* RockApp */ = { + isa = PBXGroup; + children = ( + 13B07FB01A68108700A75B9A /* AppDelegate.swift */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, + 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */, + ); + name = RockApp; + sourceTree = ""; + }; + 20D1649F2D4D80800039A91E /* BrownfieldLib */ = { + isa = PBXGroup; + children = ( + 20D1649E2D4D80800039A91E /* BrownfieldLib.h */, + 20D164A12D4D80950039A91E /* BrownfieldLib.swift */, + ); + path = BrownfieldLib; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + C853E0A265E8A672EB24A8DE /* Pods_RockApp.framework */, + 4A7CC4F5D544D927A8127D5A /* Pods_RockApp_BrownfieldLib.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* RockApp */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 20D1649F2D4D80800039A91E /* BrownfieldLib */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + BBD78D7AC51CEA395F1C20DB /* Pods */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* RockApp.app */, + 20D1648D2D4D7FAF0039A91E /* BrownfieldLib.framework */, + ); + name = Products; + sourceTree = ""; + }; + BBD78D7AC51CEA395F1C20DB /* Pods */ = { + isa = PBXGroup; + children = ( + 3B4392A12AC88292D35C810B /* Pods-RockApp.debug.xcconfig */, + 5709B34CF0A7D63546082F79 /* Pods-RockApp.release.xcconfig */, + 4D838915DF00B87281042637 /* Pods-RockApp-BrownfieldLib.debug.xcconfig */, + 25056119C0BDA4CDB86B24D9 /* Pods-RockApp-BrownfieldLib.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 20D164882D4D7FAF0039A91E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 20D164A02D4D80800039A91E /* BrownfieldLib.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 13B07F861A680F5B00A75B9A /* RockApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RockApp" */; + buildPhases = ( + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RockApp; + productName = RockApp; + productReference = 13B07F961A680F5B00A75B9A /* RockApp.app */; + productType = "com.apple.product-type.application"; + }; + 20D1648C2D4D7FAF0039A91E /* BrownfieldLib */ = { + isa = PBXNativeTarget; + buildConfigurationList = 20D164992D4D7FB00039A91E /* Build configuration list for PBXNativeTarget "BrownfieldLib" */; + buildPhases = ( + F59A31FD70D7E14811933F49 /* [CP] Check Pods Manifest.lock */, + 20D164882D4D7FAF0039A91E /* Headers */, + 20D164892D4D7FAF0039A91E /* Sources */, + 20D1648A2D4D7FAF0039A91E /* Frameworks */, + 20D1648B2D4D7FAF0039A91E /* Resources */, + 20D164A32D4D82600039A91E /* Bundle React Native code and images */, + 719E89ABC518E1BDB658B808 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = BrownfieldLib; + productName = BrownfieldLib; + productReference = 20D1648D2D4D7FAF0039A91E /* BrownfieldLib.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1210; + TargetAttributes = { + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1120; + }; + 20D1648C2D4D7FAF0039A91E = { + CreatedOnToolsVersion = 16.0; + LastSwiftMigration = 1600; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RockApp" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* RockApp */, + 20D1648C2D4D7FAF0039A91E /* BrownfieldLib */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + B16C603D25A2E5456D38112F /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 20D1648B2D4D7FAF0039A91E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/.xcode.env", + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('rock/package.json')) + '/dist/src/bin.js'\")\"\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + }; + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RockApp/Pods-RockApp-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RockApp/Pods-RockApp-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RockApp/Pods-RockApp-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 20D164A32D4D82600039A91E /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/.xcode.env", + ); + name = "Bundle React Native code and images"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('rock/package.json')) + '/dist/src/bin.js'\")\"\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + }; + 719E89ABC518E1BDB658B808 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RockApp-BrownfieldLib/Pods-RockApp-BrownfieldLib-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RockApp-BrownfieldLib/Pods-RockApp-BrownfieldLib-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RockApp-BrownfieldLib/Pods-RockApp-BrownfieldLib-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RockApp-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RockApp/Pods-RockApp-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RockApp/Pods-RockApp-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RockApp/Pods-RockApp-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + F59A31FD70D7E14811933F49 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RockApp-BrownfieldLib-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 20D164892D4D7FAF0039A91E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 20D164A22D4D80990039A91E /* BrownfieldLib.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-RockApp.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = RockApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = RockApp; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-RockApp.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = RockApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = RockApp; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 20D164962D4D7FB00039A91E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4D838915DF00B87281042637 /* Pods-RockApp-BrownfieldLib.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)React"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 20D164972D4D7FB00039A91E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 25056119C0BDA4CDB86B24D9 /* Pods-RockApp-BrownfieldLib.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)React"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_ROOT}/ReactCommon", + "${PODS_ROOT}/ReactCommon/react/nativemodule/core", + "${PODS_ROOT}/React-runtimeexecutor", + "${PODS_ROOT}/React-runtimeexecutor/platform/ios", + "${PODS_ROOT}/ReactCommon-Samples", + "${PODS_ROOT}/ReactCommon-Samples/platform/ios", + "${PODS_ROOT}/React-Fabric/react/renderer/components/view/platform/cxx", + "${PODS_ROOT}/React-NativeModulesApple", + "${PODS_ROOT}/React-graphics", + "${PODS_ROOT}/React-graphics/react/renderer/graphics/platform/ios", + "${PODS_ROOT}/React-featureflags", + "${PODS_ROOT}/React-renderercss", + "${PODS_ROOT}/React-bridging", + ); + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "$(inherited)", + "-DRCT_REMOVE_LEGACY_ARCH=1", + ); + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", + "-DRCT_REMOVE_LEGACY_ARCH=1", + ); + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); + PODFILE_DIR = "$(SRCROOT)"; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; + USE_HERMES = true; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_ROOT}/ReactCommon", + "${PODS_ROOT}/ReactCommon/react/nativemodule/core", + "${PODS_ROOT}/React-runtimeexecutor", + "${PODS_ROOT}/React-runtimeexecutor/platform/ios", + "${PODS_ROOT}/ReactCommon-Samples", + "${PODS_ROOT}/ReactCommon-Samples/platform/ios", + "${PODS_ROOT}/React-Fabric/react/renderer/components/view/platform/cxx", + "${PODS_ROOT}/React-NativeModulesApple", + "${PODS_ROOT}/React-graphics", + "${PODS_ROOT}/React-graphics/react/renderer/graphics/platform/ios", + "${PODS_ROOT}/React-featureflags", + "${PODS_ROOT}/React-renderercss", + "${PODS_ROOT}/React-bridging", + ); + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = ( + "$(inherited)", + "-DRCT_REMOVE_LEGACY_ARCH=1", + ); + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", + "-DRCT_REMOVE_LEGACY_ARCH=1", + ); + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); + PODFILE_DIR = "$(SRCROOT)"; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; + USE_HERMES = true; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RockApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 20D164992D4D7FB00039A91E /* Build configuration list for PBXNativeTarget "BrownfieldLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 20D164962D4D7FB00039A91E /* Debug */, + 20D164972D4D7FB00039A91E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RockApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/apps/RockApp/ios/RockApp.xcodeproj/xcshareddata/xcschemes/BrownfieldLib.xcscheme b/apps/RockApp/ios/RockApp.xcodeproj/xcshareddata/xcschemes/BrownfieldLib.xcscheme new file mode 100644 index 000000000..1299271a4 --- /dev/null +++ b/apps/RockApp/ios/RockApp.xcodeproj/xcshareddata/xcschemes/BrownfieldLib.xcscheme @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/RockApp/ios/RockApp.xcodeproj/xcshareddata/xcschemes/RockApp.xcscheme b/apps/RockApp/ios/RockApp.xcodeproj/xcshareddata/xcschemes/RockApp.xcscheme new file mode 100644 index 000000000..16df9364f --- /dev/null +++ b/apps/RockApp/ios/RockApp.xcodeproj/xcshareddata/xcschemes/RockApp.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/RockApp/ios/RockApp.xcworkspace/contents.xcworkspacedata b/apps/RockApp/ios/RockApp.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..f34c49c43 --- /dev/null +++ b/apps/RockApp/ios/RockApp.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/apps/RockApp/ios/RockApp/AppDelegate.swift b/apps/RockApp/ios/RockApp/AppDelegate.swift new file mode 100644 index 000000000..ce10996cc --- /dev/null +++ b/apps/RockApp/ios/RockApp/AppDelegate.swift @@ -0,0 +1,48 @@ +import UIKit +import React +import React_RCTAppDelegate +import ReactAppDependencyProvider + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + var reactNativeDelegate: ReactNativeDelegate? + var reactNativeFactory: RCTReactNativeFactory? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + let delegate = ReactNativeDelegate() + let factory = RCTReactNativeFactory(delegate: delegate) + delegate.dependencyProvider = RCTAppDependencyProvider() + + reactNativeDelegate = delegate + reactNativeFactory = factory + + window = UIWindow(frame: UIScreen.main.bounds) + + factory.startReactNative( + withModuleName: "RockApp", + in: window, + launchOptions: launchOptions + ) + + return true + } +} + +class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { + override func sourceURL(for bridge: RCTBridge) -> URL? { + self.bundleURL() + } + + override func bundleURL() -> URL? { +#if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") +#else + Bundle.main.url(forResource: "main", withExtension: "jsbundle") +#endif + } +} diff --git a/apps/RockApp/ios/RockApp/Images.xcassets/AppIcon.appiconset/Contents.json b/apps/RockApp/ios/RockApp/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..81213230d --- /dev/null +++ b/apps/RockApp/ios/RockApp/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/RockApp/ios/RockApp/Images.xcassets/Contents.json b/apps/RockApp/ios/RockApp/Images.xcassets/Contents.json new file mode 100644 index 000000000..2d92bd53f --- /dev/null +++ b/apps/RockApp/ios/RockApp/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/apps/RockApp/ios/RockApp/Info.plist b/apps/RockApp/ios/RockApp/Info.plist new file mode 100644 index 000000000..73786edd3 --- /dev/null +++ b/apps/RockApp/ios/RockApp/Info.plist @@ -0,0 +1,55 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + RockApp + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + + + NSLocationWhenInUseUsageDescription + + RCTNewArchEnabled + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/apps/RockApp/ios/RockApp/LaunchScreen.storyboard b/apps/RockApp/ios/RockApp/LaunchScreen.storyboard new file mode 100644 index 000000000..65e61807f --- /dev/null +++ b/apps/RockApp/ios/RockApp/LaunchScreen.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/RockApp/ios/RockApp/PrivacyInfo.xcprivacy b/apps/RockApp/ios/RockApp/PrivacyInfo.xcprivacy new file mode 100644 index 000000000..fc90547a7 --- /dev/null +++ b/apps/RockApp/ios/RockApp/PrivacyInfo.xcprivacy @@ -0,0 +1,37 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/apps/RockApp/jest.config.js b/apps/RockApp/jest.config.js new file mode 100644 index 000000000..0343cc9d7 --- /dev/null +++ b/apps/RockApp/jest.config.js @@ -0,0 +1,28 @@ +const path = require('node:path'); + +module.exports = { + preset: '@react-native/jest-preset', + setupFilesAfterEnv: ['/jest.setup.js'], + moduleNameMapper: { + '^react$': require.resolve('react'), + '^react/jsx-runtime$': require.resolve('react/jsx-runtime'), + '^react/jsx-dev-runtime$': require.resolve('react/jsx-dev-runtime'), + '^@testing-library/react-native$': + require.resolve('@testing-library/react-native'), + '^@callstack/react-native-brownfield$': path.join( + __dirname, + '../../packages/react-native-brownfield/src/index.ts', + ), + '^@callstack/brownfield-navigation$': path.join( + __dirname, + '../../packages/brownfield-navigation/src/index.ts', + ), + '^@callstack/brownie$': path.join( + __dirname, + '../../packages/brownie/src/index.ts', + ), + }, + transformIgnorePatterns: [ + 'node_modules/(?!((jest-)?react-native|@react-native(-community)?|@callstack/brownfield-example-shared|@callstack/brownfield-example-shared-tests|@react-navigation|react-native-screens|react-native-safe-area-context)/)', + ], +}; diff --git a/apps/RockApp/jest.setup.js b/apps/RockApp/jest.setup.js new file mode 100644 index 000000000..14d2c2591 --- /dev/null +++ b/apps/RockApp/jest.setup.js @@ -0,0 +1 @@ +require('@callstack/brownfield-example-shared-tests/jest/setup'); diff --git a/apps/RockApp/metro.config.js b/apps/RockApp/metro.config.js new file mode 100644 index 000000000..fe49ad969 --- /dev/null +++ b/apps/RockApp/metro.config.js @@ -0,0 +1,19 @@ +const path = require('node:path'); +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); +const { withMetroConfig } = require('react-native-monorepo-config'); + +/** + * Metro configuration + * https://reactnative.dev/docs/metro + * + * @type {import('metro-config').MetroConfig} + */ +const config = {}; + +module.exports = withMetroConfig( + mergeConfig(getDefaultConfig(__dirname), config), + { + root: path.resolve(__dirname, '../..'), + dirname: __dirname, + }, +); diff --git a/apps/RockApp/package.json b/apps/RockApp/package.json new file mode 100644 index 000000000..fcaa27bac --- /dev/null +++ b/apps/RockApp/package.json @@ -0,0 +1,74 @@ +{ + "name": "@callstack/brownfield-example-rock-app", + "version": "1.0.0", + "private": true, + "scripts": { + "start": "rock start", + "lint": "eslint .", + "test": "jest", + "ios": "rock run:ios", + "android": "rock run:android", + "package:ios": "rock package:ios --scheme BrownfieldLib --configuration Release", + "prepackage:aar": "brownfield codegen && yarn codegen:navigation", + "package:aar": "rock package:aar --variant Release --module-name brownfieldlib", + "publish-local:aar": "npm run package:aar && rock publish-local:aar --module-name brownfieldlib", + "brownfield:package:android": "brownfield package:android --module-name brownfieldlib --variant release", + "brownfield:publish:android": "brownfield publish:android --module-name brownfieldlib", + "brownfield:package:ios": "brownfield package:ios --scheme BrownfieldLib --configuration Release", + "e2e:build:ios": "detox build --configuration ios.sim.debug", + "e2e:test:ios": "detox test --configuration ios.sim.debug", + "ci:local:e2e:ios": "bash ../../scripts/ci-local-rnapp-ios-e2e.sh", + "codegen": "brownfield codegen", + "codegen:navigation": "yarn workspace @callstack/brownfield-example-shared codegen:navigation" + }, + "dependencies": { + "@callstack/brownfield-example-shared": "workspace:^", + "@callstack/brownfield-example-shared-tests": "workspace:^", + "@callstack/brownfield-navigation": "workspace:^", + "@callstack/brownie": "workspace:^", + "@callstack/react-native-brownfield": "workspace:^", + "@react-navigation/native": "^7.1.33", + "@react-navigation/native-stack": "^7.14.5", + "react": "19.2.3", + "react-native": "0.87.0", + "react-native-safe-area-context": "^5.9.1", + "react-native-screens": "^4.27.0" + }, + "devDependencies": { + "@babel/core": "^7.29.6", + "@babel/preset-env": "^7.25.3", + "@babel/runtime": "^7.25.0", + "@react-native-community/cli": "20.2.0", + "@react-native-community/cli-platform-android": "20.2.0", + "@react-native-community/cli-platform-ios": "20.2.0", + "@react-native/babel-preset": "0.87.0", + "@react-native/eslint-config": "0.87.0", + "@react-native/jest-preset": "0.87.0", + "@react-native/metro-config": "0.87.0", + "@react-native/typescript-config": "0.87.0", + "@rock-js/platform-android": "^0.15.1", + "@rock-js/platform-ios": "^0.15.1", + "@rock-js/plugin-brownfield-android": "^0.15.1", + "@rock-js/plugin-brownfield-ios": "^0.15.1", + "@rock-js/plugin-metro": "^0.15.1", + "@testing-library/react-native": "^13.3.3", + "@types/jest": "^30.0.0", + "@types/react": "^19.2.0", + "@types/react-test-renderer": "^19.1.0", + "detox": "^20.27.0", + "eslint": "^9.39.3", + "jest": "^29.7.0", + "prettier": "^3.8.1", + "react-native-monorepo-config": "^0.3.3", + "react-test-renderer": "19.2.3", + "rock": "^0.15.4", + "typescript": "^5.9.3" + }, + "brownie": { + "kotlin": "./android/brownfieldlib/src/main/java/com/callstack/rnbrownfield/demo/rockapp/Generated/", + "kotlinPackageName": "com.callstack.rnbrownfield.demo.rockapp" + }, + "engines": { + "node": ">= 22.11.0" + } +} diff --git a/apps/RockApp/rock.config.mjs b/apps/RockApp/rock.config.mjs new file mode 100644 index 000000000..4b94e7b32 --- /dev/null +++ b/apps/RockApp/rock.config.mjs @@ -0,0 +1,14 @@ +import { platformAndroid } from '@rock-js/platform-android'; +import { platformIOS } from '@rock-js/platform-ios'; +import { pluginBrownfieldAndroid } from '@rock-js/plugin-brownfield-android'; +import { pluginBrownfieldIos } from '@rock-js/plugin-brownfield-ios'; +import { pluginMetro } from '@rock-js/plugin-metro'; + +export default { + plugins: [pluginBrownfieldIos(), pluginBrownfieldAndroid()], + bundler: pluginMetro(), + platforms: { + ios: platformIOS(), + android: platformAndroid(), + }, +}; diff --git a/apps/RockApp/tsconfig.json b/apps/RockApp/tsconfig.json new file mode 100644 index 000000000..c41b7e201 --- /dev/null +++ b/apps/RockApp/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@react-native/typescript-config", + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["**/node_modules", "**/Pods"] +} diff --git a/apps/brownfield-example-shared-tests/detox-androidapp-variants.cjs b/apps/brownfield-example-shared-tests/detox-androidapp-variants.cjs index 26c7a9d62..07a63c992 100644 --- a/apps/brownfield-example-shared-tests/detox-androidapp-variants.cjs +++ b/apps/brownfield-example-shared-tests/detox-androidapp-variants.cjs @@ -5,7 +5,7 @@ const path = require('node:path'); /** @typedef {import('detox').DetoxConfig} DetoxConfig */ /** - * AndroidApp Detox / E2E settings per packaged RN host (RNApp, ExpoApp56, ExpoApp57). + * AndroidApp Detox / E2E settings per packaged RN host (RNApp, RockApp, ExpoApp58, ExpoApp57). * * Release builds load the JS bundle embedded in the brownfield AAR (no Metro). * @@ -33,6 +33,17 @@ const androidAppDetoxVariants = { e2eTestFile: 'androidAppBrownfield.e2e.js', nativeGreetingPattern: /Hello native Android/, }, + rock: { + rnAppDir: 'RockApp', + rnMavenPath: 'com/callstack/rnbrownfield/demo/rockapp/brownfieldlib', + gradleFlavor: 'rock', + detoxConfiguration: 'android.emu.release.rock', + detoxRcFile: '.detoxrc.rock.cjs', + e2eBuildScript: 'e2e:build:android:rock', + e2eTestScript: 'e2e:test:android:rock', + e2eTestFile: 'androidAppBrownfield.e2e.js', + nativeGreetingPattern: /Hello native Android/, + }, expo58: { rnAppDir: 'ExpoApp58', rnMavenPath: 'com/callstack/rnbrownfield/demo/expoapp58/brownfieldlib', @@ -58,7 +69,7 @@ const androidAppDetoxVariants = { }; /** - * @param {string} variant AndroidApp road-test variant (`vanilla`, `expo58`, `expo57`). + * @param {string} variant AndroidApp road-test variant (`vanilla`, `rock`, `expo58`, `expo57`). */ function getAndroidAppDetoxVariant(variant) { const config = androidAppDetoxVariants[variant]; diff --git a/apps/brownfield-example-shared-tests/detox-appleapp-variants.cjs b/apps/brownfield-example-shared-tests/detox-appleapp-variants.cjs index ef34565f0..5f63e15da 100644 --- a/apps/brownfield-example-shared-tests/detox-appleapp-variants.cjs +++ b/apps/brownfield-example-shared-tests/detox-appleapp-variants.cjs @@ -5,7 +5,7 @@ const path = require('node:path'); /** @typedef {import('detox').DetoxConfig} DetoxConfig */ /** - * AppleApp Detox / E2E settings per packaged RN host (RNApp, ExpoApp57, ExpoApp58). + * AppleApp Detox / E2E settings per packaged RN host (RNApp, RockApp, ExpoApp57, ExpoApp58). * * @type {Record Math.round(Math.random() * 255); -export const getRandomTheme = () => { + +export const getRandomTheme = (): Theme => { const primary = [getRandomValue(), getRandomValue(), getRandomValue()]; const secondary = [ 255 - (primary?.[0] || 0), diff --git a/apps/brownfield-example-shared/tsconfig.json b/apps/brownfield-example-shared/tsconfig.json new file mode 100644 index 000000000..4aca1c1d7 --- /dev/null +++ b/apps/brownfield-example-shared/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "strict": true, + "jsx": "react-jsx", + "moduleResolution": "bundler", + "module": "ESNext", + "target": "ES2022", + "skipLibCheck": true, + "noEmit": true, + "lib": ["ES2022"], + "types": [], + "paths": { + "@callstack/brownfield-navigation": [ + "../../packages/brownfield-navigation/src/index.ts" + ] + } + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/global.d.ts"] +} diff --git a/docs/docs/docs/getting-started/examples.mdx b/docs/docs/docs/getting-started/examples.mdx index c0d805f54..63e9296fd 100644 --- a/docs/docs/docs/getting-started/examples.mdx +++ b/docs/docs/docs/getting-started/examples.mdx @@ -5,17 +5,21 @@ You can find example projects demonstrating the usage of React Native Brownfield It contains the following apps: - `RNApp` - a React Native app that is packaged using React Native Brownfield to an artifact consumed in native apps, in which you can refer to an exemplar usage of the library for packaging a React Native app to a consumable artifact +- `RockApp` - the same React Native app as `RNApp`, built with [Rock](https://rockjs.dev) instead of the React Native Community CLI and packaged using Rock's [brownfield plugins](https://www.rockjs.dev/docs/brownfield/intro) +- `brownfield-example-shared` - a workspace package with the React Native UI shared by `RNApp` and `RockApp` - `ExpoApp58` - Expo application using Expo SDK v58 - `ExpoApp57` - Expo application using Expo SDK v57 -- `AndroidApp` - an Android app consuming the packaged artifact from `RNApp` or an Expo app, in which you can refer to an exemplar usage of the library for integrating React Native Brownfield into a native Android app; this app comes in flavors: +- `AndroidApp` - an Android app consuming the packaged artifact from `RNApp`, `RockApp` or an Expo app, in which you can refer to an exemplar usage of the library for integrating React Native Brownfield into a native Android app; this app comes in flavors: - `expo58` / `expo57` - which use the artifacts produced from `ExpoApp58` / `ExpoApp57` - `vanilla` - which uses the artifact produced from `RNApp` + - `rock` - which uses the artifact produced from `RockApp` - `AppleApp` - an iOS app consuming packaged XCFrameworks, in which you can refer to an exemplar usage of the library for integrating React Native Brownfield into a native iOS app; the Xcode project has one target per consumed RN app: - `Brownfield Apple App (RNApp)` — vanilla; uses the artifact from `RNApp` (scheme **Brownfield Apple App Vanilla**, configuration `Release Vanilla`) + - `Brownfield Apple App (RNApp)` — Rock; the same target, using the artifact from `RockApp` (scheme **Brownfield Apple App Rock**, configuration `Release Rock`) - `Brownfield Apple App (ExpoApp58)` — uses the artifact from `ExpoApp58` (scheme **Brownfield Apple App Expo 58**, configuration `Release`) - `Brownfield Apple App (ExpoApp57)` — uses the artifact from `ExpoApp57` (scheme **Brownfield Apple App Expo 57**, configuration `Release`) - From `apps/AppleApp`, run `yarn build:example:ios-consumer:vanilla`, `yarn build:example:ios-consumer:expo58`, or `yarn build:example:ios-consumer:expo57` to copy XCFrameworks into `package/` and build the matching target. `yarn build:example:ios-consumer:expo` is an alias for `expo57`. + From `apps/AppleApp`, run `yarn build:example:ios-consumer:vanilla`, `yarn build:example:ios-consumer:rock`, `yarn build:example:ios-consumer:expo58`, or `yarn build:example:ios-consumer:expo57` to copy XCFrameworks into `package/` and build the matching target. `yarn build:example:ios-consumer:expo` is an alias for `expo57`. ## Additional notes diff --git a/package.json b/package.json index ade1e8fb3..5aa9a32aa 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "ci:local:rnapp:e2e:ios": "bash ./scripts/ci-local-rnapp-ios-e2e.sh", "ci:local:appleapp:e2e:ios": "bash ./scripts/ci-local-appleapp-ios-e2e.sh", "ci:local:androidapp:e2e:android": "bash ./scripts/ci-local-androidapp-android-e2e.sh", + "ci:local:androidapp:e2e:android:rock": "bash ./scripts/ci-local-androidapp-android-e2e.sh --variant rock", "ci:local:androidapp:e2e:android:expo58": "bash ./scripts/ci-local-androidapp-android-e2e.sh --variant expo58", "ci:local:androidapp:e2e:android:expo57": "bash ./scripts/ci-local-androidapp-android-e2e.sh --variant expo57" }, diff --git a/packages/cli/src/navigation/__tests__/generators.test.ts b/packages/cli/src/navigation/__tests__/generators.test.ts index bfea40caf..b8e0dc627 100644 --- a/packages/cli/src/navigation/__tests__/generators.test.ts +++ b/packages/cli/src/navigation/__tests__/generators.test.ts @@ -92,6 +92,10 @@ describe('navigation code generators', () => { expect(turboModuleSpec).toContain('export interface Spec extends TurboModule'); expect(turboModuleSpec).toContain('openScreen(route: string, params?: Object): void;'); + expect(indexTs).toContain( + "import NativeBrownfieldNavigation from './NativeBrownfieldNavigation';\n\n" + + 'const BrownfieldNavigation' + ); expect(indexTs).toContain('openScreen: (route: string, params?: Object)'); expect(indexTs).toContain('NativeBrownfieldNavigation.openScreen(route, params)'); @@ -151,7 +155,9 @@ describe('navigation code generators', () => { ); expect(indexTs).toContain( - "import type { UserType } from './NativeBrownfieldNavigation';" + "import NativeBrownfieldNavigation from './NativeBrownfieldNavigation';\n" + + "import type { UserType } from './NativeBrownfieldNavigation';\n\n" + + 'const BrownfieldNavigation' ); expect(indexTs).toContain('navigateToSettings: (user: UserType)'); expect(indexDts).toContain( diff --git a/packages/cli/src/navigation/generators/ts.ts b/packages/cli/src/navigation/generators/ts.ts index 9f106b2c3..820edf885 100644 --- a/packages/cli/src/navigation/generators/ts.ts +++ b/packages/cli/src/navigation/generators/ts.ts @@ -122,7 +122,7 @@ function buildTypeImportLine( return ''; } - return `import type { ${names} } from './NativeBrownfieldNavigation';\n`; + return `import type { ${names} } from './NativeBrownfieldNavigation';`; } export function generateIndexTs( @@ -151,8 +151,7 @@ export function generateIndexTs( .join(',\n'); return `import NativeBrownfieldNavigation from './NativeBrownfieldNavigation'; -${typeImportLine} - +${typeImportLine ? `${typeImportLine}\n` : ''} const BrownfieldNavigation = { ${functionImplementations}, }; @@ -223,7 +222,7 @@ export function generateIndexDts( }) .join('\n'); - return `${typeImportLine}declare const BrownfieldNavigation: { + return `${typeImportLine ? `${typeImportLine}\n` : ''}declare const BrownfieldNavigation: { ${methodSignatures} }; diff --git a/scripts/ci-local-androidapp-android-e2e.sh b/scripts/ci-local-androidapp-android-e2e.sh index 0ca43acff..690a77560 100755 --- a/scripts/ci-local-androidapp-android-e2e.sh +++ b/scripts/ci-local-androidapp-android-e2e.sh @@ -1,10 +1,13 @@ #!/usr/bin/env bash -# Local-only Detox E2E for apps/AndroidApp (mirrors CI android-androidapp-vanilla / expo58 / expo57). +# Local-only Detox E2E for apps/AndroidApp (mirrors CI android-androidapp-vanilla / expo58 / expo57; +# the rock variant is local-only, CI android-androidapp-rock only builds). # # Usage (from repo root): # yarn ci:local:androidapp:e2e:android +# yarn ci:local:androidapp:e2e:android:rock # yarn ci:local:androidapp:e2e:android:expo58 # yarn ci:local:androidapp:e2e:android:expo57 +# yarn ci:local:androidapp:e2e:android --variant rock # yarn ci:local:androidapp:e2e:android --variant expo58 # yarn ci:local:androidapp:e2e:android --variant expo57 # yarn ci:local:androidapp:e2e:android --skip-install @@ -32,7 +35,7 @@ while [[ $# -gt 0 ]]; do --) shift; break ;; --variant=*) VARIANT="${1#*=}"; shift ;; --variant) - VARIANT="${2:?--variant requires a value (vanilla, expo58, or expo57)}" + VARIANT="${2:?--variant requires a value (vanilla, rock, expo58, or expo57)}" shift 2 ;; --avd=*) DETOX_AVD="${1#*=}"; shift ;; @@ -45,7 +48,7 @@ while [[ $# -gt 0 ]]; do --rebuild) REBUILD_ONLY=true; SKIP_INSTALL=true; shift ;; --build-only) BUILD_ONLY=true; shift ;; -h|--help) - sed -n '2,17p' "$0" + sed -n '2,20p' "$0" exit 0 ;; *) diff --git a/scripts/ci-local-appleapp-ios-e2e.sh b/scripts/ci-local-appleapp-ios-e2e.sh index abf30a11f..a97918ab2 100755 --- a/scripts/ci-local-appleapp-ios-e2e.sh +++ b/scripts/ci-local-appleapp-ios-e2e.sh @@ -1,8 +1,10 @@ #!/usr/bin/env bash -# Local-only Detox E2E for apps/AppleApp (mirrors CI ios-appleapp-vanilla / ios-appleapp-expo jobs). +# Local-only Detox E2E for apps/AppleApp (mirrors CI ios-appleapp-vanilla / ios-appleapp-expo jobs; +# the rock variant is local-only, CI ios-appleapp-rock only builds). # # Usage (from repo root): # yarn ci:local:appleapp:e2e:ios +# yarn ci:local:appleapp:e2e:ios --variant rock # yarn ci:local:appleapp:e2e:ios --variant expo57 # yarn ci:local:appleapp:e2e:ios --variant expo58 # yarn ci:local:appleapp:e2e:ios --clean-ios @@ -12,9 +14,9 @@ # yarn ci:local:appleapp:e2e:ios --build-only # yarn ci:local:appleapp:e2e:ios --no-restore-pods # keep E2E Pods.xcodeproj patches after exit # -# Local runs auto-run `pod install` on exit to restore Brownfield pod Debug settings (vanilla RN host). +# Local runs auto-run `pod install` on exit to restore Brownfield pod Debug settings (vanilla and rock RN hosts). # From apps/AppleApp: yarn ci:local:e2e:ios [--flags] -# yarn ci:local:e2e:ios:expo57 / yarn ci:local:e2e:ios:expo58 +# yarn ci:local:e2e:ios:rock / yarn ci:local:e2e:ios:expo57 / yarn ci:local:e2e:ios:expo58 # set -euo pipefail @@ -29,11 +31,11 @@ while [[ $# -gt 0 ]]; do --) shift; break ;; --variant=*) VARIANT="${1#*=}"; shift ;; --variant) - VARIANT="${2:?--variant requires a value (vanilla, expo57, or expo58)}" + VARIANT="${2:?--variant requires a value (vanilla, rock, expo57, or expo58)}" shift 2 ;; -h|--help) - sed -n '2,15p' "$0" + sed -n '2,19p' "$0" exit 0 ;; *) @@ -77,11 +79,11 @@ if [[ "${CLEAN_IOS}" == "true" ]]; then fi if ci_local_e2e_should_build "${TEST_ONLY}" && [[ "${REBUILD_ONLY}" != "true" ]]; then - if [[ "${VARIANT}" == "vanilla" ]]; then - echo "==> brownfield codegen (RNApp)" + if [[ "${VARIANT}" == "vanilla" || "${VARIANT}" == "rock" ]]; then + echo "==> brownfield codegen (${XCFRAMEWORK_APP})" (cd "${RN_PROJECT_PATH}" && yarn codegen) - echo "==> pod install (RNApp — build RN from source for RNScreens)" + echo "==> pod install (${XCFRAMEWORK_APP} — build RN from source for RNScreens)" (cd "${RN_PROJECT_IOS_PATH}" && RCT_USE_PREBUILT_RNCORE=0 pod install) ci_local_e2e_apply_brownfield_debug_pod_settings "${RN_PROJECT_IOS_PATH}" fi diff --git a/yarn.lock b/yarn.lock index 79c14bdc0..94f8e6bcf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -53,7 +53,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.29.7": +"@babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.29.7": version: 7.29.7 resolution: "@babel/code-frame@npm:7.29.7" dependencies: @@ -1984,6 +1984,7 @@ __metadata: "@babel/core": "npm:^7.29.6" "@babel/preset-env": "npm:^7.25.3" "@babel/runtime": "npm:^7.25.0" + "@callstack/brownfield-example-shared": "workspace:^" "@callstack/brownfield-example-shared-tests": "workspace:^" "@callstack/brownfield-navigation": "workspace:^" "@callstack/brownie": "workspace:^" @@ -2016,6 +2017,52 @@ __metadata: languageName: unknown linkType: soft +"@callstack/brownfield-example-rock-app@workspace:apps/RockApp": + version: 0.0.0-use.local + resolution: "@callstack/brownfield-example-rock-app@workspace:apps/RockApp" + dependencies: + "@babel/core": "npm:^7.29.6" + "@babel/preset-env": "npm:^7.25.3" + "@babel/runtime": "npm:^7.25.0" + "@callstack/brownfield-example-shared": "workspace:^" + "@callstack/brownfield-example-shared-tests": "workspace:^" + "@callstack/brownfield-navigation": "workspace:^" + "@callstack/brownie": "workspace:^" + "@callstack/react-native-brownfield": "workspace:^" + "@react-native-community/cli": "npm:20.2.0" + "@react-native-community/cli-platform-android": "npm:20.2.0" + "@react-native-community/cli-platform-ios": "npm:20.2.0" + "@react-native/babel-preset": "npm:0.87.0" + "@react-native/eslint-config": "npm:0.87.0" + "@react-native/jest-preset": "npm:0.87.0" + "@react-native/metro-config": "npm:0.87.0" + "@react-native/typescript-config": "npm:0.87.0" + "@react-navigation/native": "npm:^7.1.33" + "@react-navigation/native-stack": "npm:^7.14.5" + "@rock-js/platform-android": "npm:^0.15.1" + "@rock-js/platform-ios": "npm:^0.15.1" + "@rock-js/plugin-brownfield-android": "npm:^0.15.1" + "@rock-js/plugin-brownfield-ios": "npm:^0.15.1" + "@rock-js/plugin-metro": "npm:^0.15.1" + "@testing-library/react-native": "npm:^13.3.3" + "@types/jest": "npm:^30.0.0" + "@types/react": "npm:^19.2.0" + "@types/react-test-renderer": "npm:^19.1.0" + detox: "npm:^20.27.0" + eslint: "npm:^9.39.3" + jest: "npm:^29.7.0" + prettier: "npm:^3.8.1" + react: "npm:19.2.3" + react-native: "npm:0.87.0" + react-native-monorepo-config: "npm:^0.3.3" + react-native-safe-area-context: "npm:^5.9.1" + react-native-screens: "npm:^4.27.0" + react-test-renderer: "npm:19.2.3" + rock: "npm:^0.15.4" + typescript: "npm:^5.9.3" + languageName: unknown + linkType: soft + "@callstack/brownfield-example-shared-tests@workspace:^, @callstack/brownfield-example-shared-tests@workspace:apps/brownfield-example-shared-tests": version: 0.0.0-use.local resolution: "@callstack/brownfield-example-shared-tests@workspace:apps/brownfield-example-shared-tests" @@ -2026,6 +2073,8 @@ __metadata: "@testing-library/react-native": "npm:^13.3.3" "@types/jest": "npm:^30.0.0" "@types/react": "npm:^19.1.1" + react: "npm:19.2.3" + react-native: "npm:0.87.0" typescript: "npm:5.9.3" peerDependencies: "@testing-library/react-native": ">=12" @@ -2035,6 +2084,48 @@ __metadata: languageName: unknown linkType: soft +"@callstack/brownfield-example-shared@workspace:^, @callstack/brownfield-example-shared@workspace:apps/brownfield-example-shared": + version: 0.0.0-use.local + resolution: "@callstack/brownfield-example-shared@workspace:apps/brownfield-example-shared" + dependencies: + "@babel/core": "npm:^7.29.6" + "@babel/preset-env": "npm:^7.25.3" + "@babel/runtime": "npm:^7.25.0" + "@callstack/brownfield-example-shared-tests": "workspace:^" + "@callstack/brownfield-navigation": "workspace:^" + "@callstack/brownie": "workspace:^" + "@callstack/react-native-brownfield": "workspace:^" + "@react-native-community/cli": "npm:20.2.0" + "@react-native-community/cli-platform-android": "npm:20.2.0" + "@react-native-community/cli-platform-ios": "npm:20.2.0" + "@react-native/babel-preset": "npm:0.87.0" + "@react-native/eslint-config": "npm:0.87.0" + "@react-native/jest-preset": "npm:0.87.0" + "@react-native/metro-config": "npm:0.87.0" + "@react-native/typescript-config": "npm:0.87.0" + "@react-navigation/native": "npm:^7.1.33" + "@react-navigation/native-stack": "npm:^7.14.5" + "@types/react": "npm:^19.2.0" + eslint: "npm:^9.39.3" + react: "npm:19.2.3" + react-native: "npm:0.87.0" + react-native-safe-area-context: "npm:^5.9.1" + react-native-screens: "npm:^4.27.0" + typescript: "npm:5.9.3" + peerDependencies: + "@callstack/brownfield-example-shared-tests": "workspace:^" + "@callstack/brownfield-navigation": "workspace:^" + "@callstack/brownie": "workspace:^" + "@callstack/react-native-brownfield": "workspace:^" + "@react-navigation/native": "*" + "@react-navigation/native-stack": "*" + react: "*" + react-native: "*" + react-native-safe-area-context: "*" + react-native-screens: "*" + languageName: unknown + linkType: soft + "@callstack/brownfield-gradle-plugin-react@workspace:gradle-plugins/react": version: 0.0.0-use.local resolution: "@callstack/brownfield-gradle-plugin-react@workspace:gradle-plugins/react" @@ -5378,7 +5469,7 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-server-api@npm:20.2.0": +"@react-native-community/cli-server-api@npm:20.2.0, @react-native-community/cli-server-api@npm:^20.0.0": version: 20.2.0 resolution: "@react-native-community/cli-server-api@npm:20.2.0" dependencies: @@ -6503,7 +6594,20 @@ __metadata: languageName: node linkType: hard -"@rock-js/platform-android@npm:^0.15.4": +"@rock-js/config@npm:^0.15.4": + version: 0.15.4 + resolution: "@rock-js/config@npm:0.15.4" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@rock-js/provider-github": "npm:^0.15.4" + "@rock-js/tools": "npm:^0.15.4" + joi: "npm:^17.13.6" + tslib: "npm:^2.3.0" + checksum: 10/71c6282cdb5e484f8ba62f8b1217bd2a1e2d746e0b6b47d54d42efda3fdeb9bf8ccb2bf401b5b655bc50ac411b050616862fa725352b49ee1877023f29f2233e + languageName: node + linkType: hard + +"@rock-js/platform-android@npm:^0.15.1, @rock-js/platform-android@npm:^0.15.4": version: 0.15.4 resolution: "@rock-js/platform-android@npm:0.15.4" dependencies: @@ -6528,7 +6632,20 @@ __metadata: languageName: node linkType: hard -"@rock-js/plugin-brownfield-android@npm:^0.15.4": +"@rock-js/platform-ios@npm:^0.15.1": + version: 0.15.4 + resolution: "@rock-js/platform-ios@npm:0.15.4" + dependencies: + "@react-native-community/cli-config-apple": "npm:^20.0.0" + "@react-native-community/cli-types": "npm:^20.0.0" + "@rock-js/platform-apple-helpers": "npm:^0.15.4" + "@rock-js/tools": "npm:^0.15.4" + tslib: "npm:^2.3.0" + checksum: 10/60b8a7cb2ce847723adf512b85fa88bf9dc627e2dda86bf162a27f534401c3025893badd1e83f28993c59722e885cee229b8cbf4df7dd10ce47bc39de9de8ec5 + languageName: node + linkType: hard + +"@rock-js/plugin-brownfield-android@npm:^0.15.1, @rock-js/plugin-brownfield-android@npm:^0.15.4": version: 0.15.4 resolution: "@rock-js/plugin-brownfield-android@npm:0.15.4" dependencies: @@ -6540,7 +6657,7 @@ __metadata: languageName: node linkType: hard -"@rock-js/plugin-brownfield-ios@npm:^0.15.4": +"@rock-js/plugin-brownfield-ios@npm:^0.15.1, @rock-js/plugin-brownfield-ios@npm:^0.15.4": version: 0.15.4 resolution: "@rock-js/plugin-brownfield-ios@npm:0.15.4" dependencies: @@ -6553,6 +6670,32 @@ __metadata: languageName: node linkType: hard +"@rock-js/plugin-metro@npm:^0.15.1": + version: 0.15.4 + resolution: "@rock-js/plugin-metro@npm:0.15.4" + dependencies: + "@react-native-community/cli-server-api": "npm:^20.0.0" + "@rock-js/tools": "npm:^0.15.4" + metro: "npm:^0.85.0" + metro-config: "npm:^0.85.0" + metro-core: "npm:^0.85.0" + metro-resolver: "npm:^0.85.0" + tslib: "npm:^2.3.0" + checksum: 10/b0ce21ca4f7c593edb64c3c76ee5fa63f834aab9348dabc2a7238b342cdd521aa5b0ba1f2b199600264c9f1222d5b9d834c0d64d1d4cda6ace302dbfc5712ecf + languageName: node + linkType: hard + +"@rock-js/provider-github@npm:^0.15.4": + version: 0.15.4 + resolution: "@rock-js/provider-github@npm:0.15.4" + dependencies: + "@rock-js/tools": "npm:^0.15.4" + ts-regex-builder: "npm:^1.8.2" + tslib: "npm:^2.3.0" + checksum: 10/339fb66cbb1411aa97e5eba13d19f5de04928c96acce9ededb519d36200df105a0e886fb565fffe874d4cc82d61caf488abce0cbe778abbd3556eed427361bb4 + languageName: node + linkType: hard + "@rock-js/tools@npm:^0.13.5": version: 0.13.5 resolution: "@rock-js/tools@npm:0.13.5" @@ -10202,7 +10345,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^12.0.0": +"commander@npm:^12.0.0, commander@npm:^12.1.0": version: 12.1.0 resolution: "commander@npm:12.1.0" checksum: 10/cdaeb672d979816853a4eed7f1310a9319e8b976172485c2a6b437ed0db0a389a44cfb222bfbde772781efa9f215bdd1b936f80d6b249485b465c6cb906e1f93 @@ -15503,6 +15646,19 @@ __metadata: languageName: node linkType: hard +"joi@npm:^17.13.6": + version: 17.13.8 + resolution: "joi@npm:17.13.8" + dependencies: + "@hapi/hoek": "npm:^9.3.0" + "@hapi/topo": "npm:^5.1.0" + "@sideway/address": "npm:^4.1.5" + "@sideway/formula": "npm:^3.0.1" + "@sideway/pinpoint": "npm:^2.0.0" + checksum: 10/7d8ccb06cee958516748519cb46430b1bf5b732f54428a5daf8f8630290c928be1abb7d3c3c2506d68ba76d1c1abe480e087255c34b839aae47b2ee2c76f587d + languageName: node + linkType: hard + "joi@npm:^17.2.1": version: 17.13.4 resolution: "joi@npm:17.13.4" @@ -16582,6 +16738,19 @@ __metadata: languageName: node linkType: hard +"metro-babel-transformer@npm:0.85.0": + version: 0.85.0 + resolution: "metro-babel-transformer@npm:0.85.0" + dependencies: + "@babel/core": "npm:^7.25.2" + flow-enums-runtime: "npm:^0.0.6" + hermes-parser: "npm:0.36.1" + metro-cache-key: "npm:0.85.0" + nullthrows: "npm:^1.1.1" + checksum: 10/c774feb69e83ec35dc86f7947d6d97ba950fa5798fa311a339da83435833b9a8e27a1559f92d0c06c076a3a76ae0c2f31f4a3b75f1255c7405082df420c30a18 + languageName: node + linkType: hard + "metro-babel-transformer@npm:0.87.1": version: 0.87.1 resolution: "metro-babel-transformer@npm:0.87.1" @@ -16613,6 +16782,15 @@ __metadata: languageName: node linkType: hard +"metro-cache-key@npm:0.85.0": + version: 0.85.0 + resolution: "metro-cache-key@npm:0.85.0" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/66c31668ea9338cf37c693b704375c82af06ab4aac8a06e676ecef1b4ee786b71e0b2622e26eb43cdacec2f7a0f0bbf3ab5b4b98d446bd5674dcd21cd4d4c360 + languageName: node + linkType: hard + "metro-cache-key@npm:0.87.1": version: 0.87.1 resolution: "metro-cache-key@npm:0.87.1" @@ -16646,6 +16824,18 @@ __metadata: languageName: node linkType: hard +"metro-cache@npm:0.85.0": + version: 0.85.0 + resolution: "metro-cache@npm:0.85.0" + dependencies: + exponential-backoff: "npm:^3.1.1" + flow-enums-runtime: "npm:^0.0.6" + https-proxy-agent: "npm:^7.0.5" + metro-core: "npm:0.85.0" + checksum: 10/47541992d0494e4726c72184496f7418e8a5449a58cfeeb93f511f6c663c2d043d5fe307c1e03c7c4f865e0965b62fd4ca2d5b3fae3f4f4c1d2bd98cd63ca46c + languageName: node + linkType: hard + "metro-cache@npm:0.87.1": version: 0.87.1 resolution: "metro-cache@npm:0.87.1" @@ -16690,6 +16880,22 @@ __metadata: languageName: node linkType: hard +"metro-config@npm:0.85.0, metro-config@npm:^0.85.0": + version: 0.85.0 + resolution: "metro-config@npm:0.85.0" + dependencies: + connect: "npm:^3.6.5" + flow-enums-runtime: "npm:^0.0.6" + jest-validate: "npm:^29.7.0" + metro: "npm:0.85.0" + metro-cache: "npm:0.85.0" + metro-core: "npm:0.85.0" + metro-runtime: "npm:0.85.0" + yaml: "npm:^2.6.1" + checksum: 10/4a0efa66bd2ee707fdd6b78d0fb3574fdea1f6540b15ed8b45fe685b4f54a4a2b58ecddc98ce4d26fcd3c73946f8ab34bbc77d83493a6d6dba51dca31be2d0b3 + languageName: node + linkType: hard + "metro-config@npm:0.87.1, metro-config@npm:^0.87.0": version: 0.87.1 resolution: "metro-config@npm:0.87.1" @@ -16727,6 +16933,17 @@ __metadata: languageName: node linkType: hard +"metro-core@npm:0.85.0, metro-core@npm:^0.85.0": + version: 0.85.0 + resolution: "metro-core@npm:0.85.0" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + lodash.throttle: "npm:^4.1.1" + metro-resolver: "npm:0.85.0" + checksum: 10/57e77326fa4052fc3da440ac416f5b5193e5fbdb8d66d1d13e3fd73e9d7249257ca2620c82bef279b3aa85fd22e9adb83255febd004543ece6292a874ebda184 + languageName: node + linkType: hard + "metro-core@npm:0.87.1": version: 0.87.1 resolution: "metro-core@npm:0.87.1" @@ -16772,6 +16989,23 @@ __metadata: languageName: node linkType: hard +"metro-file-map@npm:0.85.0": + version: 0.85.0 + resolution: "metro-file-map@npm:0.85.0" + dependencies: + debug: "npm:^4.4.0" + fb-watchman: "npm:^2.0.0" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + nullthrows: "npm:^1.1.1" + walker: "npm:^1.0.7" + checksum: 10/0c389730c999f599bc94649c593066fec6364acccf6bc5e4a526ba86d09e53135d0b763c77072e8b5feffb5a03f1cf407285a28c49e5cb11b7f8bb286ddc9a33 + languageName: node + linkType: hard + "metro-file-map@npm:0.87.1": version: 0.87.1 resolution: "metro-file-map@npm:0.87.1" @@ -16808,6 +17042,16 @@ __metadata: languageName: node linkType: hard +"metro-minify-terser@npm:0.85.0": + version: 0.85.0 + resolution: "metro-minify-terser@npm:0.85.0" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + terser: "npm:^5.15.0" + checksum: 10/41f40c0f59050ba7b51936a0bf8640abe83685f6675731981729d3cc6a5a7e23d64d0419b18ee16741ab6afed91e457434461e10aebb910d21b301eb24c92492 + languageName: node + linkType: hard + "metro-minify-terser@npm:0.87.1": version: 0.87.1 resolution: "metro-minify-terser@npm:0.87.1" @@ -16836,6 +17080,15 @@ __metadata: languageName: node linkType: hard +"metro-resolver@npm:0.85.0, metro-resolver@npm:^0.85.0": + version: 0.85.0 + resolution: "metro-resolver@npm:0.85.0" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/ecd04428f6c2527e982a873e19cf3572d2ad5113e955950758777a1e1517cafe9a635338f1ebeb9482b55a5fcdd5437e9563ad85afa374a90fe9abd5b9a4306c + languageName: node + linkType: hard + "metro-resolver@npm:0.87.1": version: 0.87.1 resolution: "metro-resolver@npm:0.87.1" @@ -16865,6 +17118,16 @@ __metadata: languageName: node linkType: hard +"metro-runtime@npm:0.85.0": + version: 0.85.0 + resolution: "metro-runtime@npm:0.85.0" + dependencies: + "@babel/runtime": "npm:^7.25.0" + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/eccb4e34930f46a479e2d005f927fe9f4e935b069b5ca7deb4b6a8a8c4e2a12519ebbbceee8223c79d908839da24cfb7f6132d3443356f02024df504fcf78546 + languageName: node + linkType: hard + "metro-runtime@npm:0.87.1, metro-runtime@npm:^0.87.0": version: 0.87.1 resolution: "metro-runtime@npm:0.87.1" @@ -16909,6 +17172,23 @@ __metadata: languageName: node linkType: hard +"metro-source-map@npm:0.85.0": + version: 0.85.0 + resolution: "metro-source-map@npm:0.85.0" + dependencies: + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-symbolicate: "npm:0.85.0" + nullthrows: "npm:^1.1.1" + ob1: "npm:0.85.0" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + checksum: 10/8427e1c9e086aec01909bfd0f6361abb5e82bee70e93aa26d0d419b5f4e4c77078cfb841d3e9ef9694c630bb672e0ffffad29d83ee3b96d5521b59595f8cf3b9 + languageName: node + linkType: hard + "metro-source-map@npm:0.87.1, metro-source-map@npm:^0.87.0": version: 0.87.1 resolution: "metro-source-map@npm:0.87.1" @@ -16958,6 +17238,22 @@ __metadata: languageName: node linkType: hard +"metro-symbolicate@npm:0.85.0": + version: 0.85.0 + resolution: "metro-symbolicate@npm:0.85.0" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-source-map: "npm:0.85.0" + nullthrows: "npm:^1.1.1" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + bin: + metro-symbolicate: src/index.js + checksum: 10/c32b761972a16c14bd7f89345b5129004994a24e7583e28a481a9ace82a3553d501c0a5d58bc8ebd92aac8811a749b4ff850d2881252588757e69f97aeb71c01 + languageName: node + linkType: hard + "metro-symbolicate@npm:0.87.1": version: 0.87.1 resolution: "metro-symbolicate@npm:0.87.1" @@ -17002,6 +17298,20 @@ __metadata: languageName: node linkType: hard +"metro-transform-plugins@npm:0.85.0": + version: 0.85.0 + resolution: "metro-transform-plugins@npm:0.85.0" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + nullthrows: "npm:^1.1.1" + checksum: 10/62ea87550d316c2bb1ab3733f51bdbb93fc56ca5550b7ee5840a779e3ba01659595eeb40f2b77c099161adaac348e0f173ef7e4086e6423cab4824fb383cc01b + languageName: node + linkType: hard + "metro-transform-plugins@npm:0.87.1": version: 0.87.1 resolution: "metro-transform-plugins@npm:0.87.1" @@ -17058,6 +17368,27 @@ __metadata: languageName: node linkType: hard +"metro-transform-worker@npm:0.85.0": + version: 0.85.0 + resolution: "metro-transform-worker@npm:0.85.0" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + metro: "npm:0.85.0" + metro-babel-transformer: "npm:0.85.0" + metro-cache: "npm:0.85.0" + metro-cache-key: "npm:0.85.0" + metro-minify-terser: "npm:0.85.0" + metro-source-map: "npm:0.85.0" + metro-transform-plugins: "npm:0.85.0" + nullthrows: "npm:^1.1.1" + checksum: 10/67daccf09e999021519e555d6f536f4270d60d616a6c7ec4abcf657367e8cc5ce592ddfe75d48e45d850f7a8d44944d2381d1b1a2efd9b982f2fc4e47fa68274 + languageName: node + linkType: hard + "metro-transform-worker@npm:0.87.1": version: 0.87.1 resolution: "metro-transform-worker@npm:0.87.1" @@ -17177,6 +17508,55 @@ __metadata: languageName: node linkType: hard +"metro@npm:0.85.0, metro@npm:^0.85.0": + version: 0.85.0 + resolution: "metro@npm:0.85.0" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + accepts: "npm:^2.0.0" + ci-info: "npm:^2.0.0" + connect: "npm:^3.6.5" + debug: "npm:^4.4.0" + error-stack-parser: "npm:^2.0.6" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + hermes-parser: "npm:0.36.1" + image-size: "npm:^1.0.2" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + jsc-safe-url: "npm:^0.2.2" + lodash.throttle: "npm:^4.1.1" + metro-babel-transformer: "npm:0.85.0" + metro-cache: "npm:0.85.0" + metro-cache-key: "npm:0.85.0" + metro-config: "npm:0.85.0" + metro-core: "npm:0.85.0" + metro-file-map: "npm:0.85.0" + metro-resolver: "npm:0.85.0" + metro-runtime: "npm:0.85.0" + metro-source-map: "npm:0.85.0" + metro-symbolicate: "npm:0.85.0" + metro-transform-plugins: "npm:0.85.0" + metro-transform-worker: "npm:0.85.0" + mime-types: "npm:^3.0.1" + nullthrows: "npm:^1.1.1" + serialize-error: "npm:^2.1.0" + source-map: "npm:^0.5.6" + throat: "npm:^5.0.0" + ws: "npm:^7.5.10" + yargs: "npm:^17.6.2" + bin: + metro: src/cli.js + checksum: 10/560ba6a7efab4bc858e0ccf758206e8b00ba56100f553c2b95bbc0840e9f6983b2ce184efd2bb13c9f0022c0ddfe9adcff69c5c3143467076b1e45397aad6578 + languageName: node + linkType: hard + "metro@npm:0.87.1, metro@npm:^0.87.0": version: 0.87.1 resolution: "metro@npm:0.87.1" @@ -18268,6 +18648,15 @@ __metadata: languageName: node linkType: hard +"ob1@npm:0.85.0": + version: 0.85.0 + resolution: "ob1@npm:0.85.0" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/8799123deeb5b0850dee9156a42101a20d45a01be6db79e104c2bb9f2b70281b15db878dd56d7b4a7b9f912d9e867c2dbecc56082b1750a06f635ebd4f5bdf90 + languageName: node + linkType: hard + "ob1@npm:0.87.1": version: 0.87.1 resolution: "ob1@npm:0.87.1" @@ -20479,6 +20868,23 @@ __metadata: languageName: node linkType: hard +"rock@npm:^0.15.4": + version: 0.15.4 + resolution: "rock@npm:0.15.4" + dependencies: + "@react-native-community/cli-config": "npm:^20.0.0" + "@rock-js/config": "npm:^0.15.4" + "@rock-js/tools": "npm:^0.15.4" + adm-zip: "npm:^0.5.16" + commander: "npm:^12.1.0" + tar: "npm:^7.5.1" + tslib: "npm:^2.3.0" + bin: + rock: dist/src/bin.js + checksum: 10/990e547c13247c03030783ea725d1b3fd55c334d78d24528d56352406ef88afb2f4a40bac425ebd45dfd1a108cfa372aa18c0204d7543120666c1ec784a77768 + languageName: node + linkType: hard + "rolldown@npm:~1.1.5": version: 1.1.5 resolution: "rolldown@npm:1.1.5" @@ -21959,6 +22365,13 @@ __metadata: languageName: node linkType: hard +"ts-regex-builder@npm:^1.8.2": + version: 1.8.2 + resolution: "ts-regex-builder@npm:1.8.2" + checksum: 10/d154172ba954a0014c573ab8b0308439d4267653a2be7e06c85449bc506a2aafb7fdeec59f289f8a39c89b49b66c101222b6292382b5be7d91122f7c4662c652 + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.15.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0"