diff --git a/.changeset/config.json b/.changeset/config.json index 1ff23394..bd989597 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -22,10 +22,11 @@ "@callstack/brownfield-example-android-app", "@callstack/brownfield-example-ios-app", "@callstack/brownfield-example-rn-app", - "@callstack/brownfield-example-expo-app-54", "@callstack/brownfield-example-expo-app-55", + "@callstack/brownfield-example-expo-app-56", + "@callstack/brownfield-gradle-plugin-react", "@callstack/brownfield-example-shared-tests", - "@callstack/brownfield-gradle-plugin-react" + "@callstack/brownfield-example-expo-app-57" ], "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": { "onlyUpdatePeerDependentsWhenOutOfRange": true, diff --git a/.changeset/fair-swans-remain.md b/.changeset/fair-swans-remain.md deleted file mode 100644 index dcf51ab7..00000000 --- a/.changeset/fair-swans-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@callstack/react-native-brownfield': patch ---- - -fix: brownfield Gradle Plugin not to depend on \*UpdatesResources task from expo-updates if it is absent diff --git a/.changeset/nine-mice-fall.md b/.changeset/nine-mice-fall.md deleted file mode 100644 index 473b5a7f..00000000 --- a/.changeset/nine-mice-fall.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@callstack/react-native-brownfield': patch -'@callstack/brownfield-cli': patch ---- - -feat: support brownfield unified config file in Expo diff --git a/.changeset/small-clouds-train.md b/.changeset/small-clouds-train.md new file mode 100644 index 00000000..a68c9bd7 --- /dev/null +++ b/.changeset/small-clouds-train.md @@ -0,0 +1,6 @@ +--- +'@callstack/brownfield-navigation': minor +'@callstack/brownfield-cli': minor +--- + +feat: add support for callback and promise to brownfield navigation diff --git a/.changeset/vast-waves-itch.md b/.changeset/vast-waves-itch.md deleted file mode 100644 index 88238eab..00000000 --- a/.changeset/vast-waves-itch.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@callstack/react-native-brownfield': patch -'@callstack/brownfield-cli': patch ---- - -feat: support local BGP in Expo config plugin diff --git a/.changeset/young-snails-lose.md b/.changeset/young-snails-lose.md deleted file mode 100644 index 69abe525..00000000 --- a/.changeset/young-snails-lose.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@callstack/brownfield-cli': patch ---- - -fix: generate config schema with descriptions, add more descriptions diff --git a/.github/actions/androidapp-road-test/action.yml b/.github/actions/androidapp-road-test/action.yml index 974a6922..c1a83fc0 100644 --- a/.github/actions/androidapp-road-test/action.yml +++ b/.github/actions/androidapp-road-test/action.yml @@ -19,6 +19,11 @@ inputs: required: false default: 'true' + skip-setup: + description: 'Skip yarn install/build when the caller already prepared the monorepo (e.g. Expo preview workflow)' + required: false + default: 'false' + run-e2e: description: 'Run Detox E2E after packaging (uses release APK with embedded JS bundle, no Metro). Ignored when e2e-phase is set.' required: false @@ -71,6 +76,7 @@ runs: shell: bash - name: Setup + if: inputs.skip-setup != 'true' uses: ./.github/actions/setup with: restore-turbo-cache: ${{ inputs.restore-turbo-cache }} @@ -394,6 +400,7 @@ runs: cd apps/AndroidApp yarn "$ANDROIDAPP_E2E_TEST_SCRIPT" env: + ANDROIDAPP_VARIANT: ${{ inputs.flavor }} ANDROIDAPP_E2E_TEST_SCRIPT: ${{ env.ANDROIDAPP_E2E_TEST_SCRIPT }} - name: Save Android ccache (after E2E) diff --git a/.github/actions/appleapp-road-test/action.yml b/.github/actions/appleapp-road-test/action.yml index 36e0b5c1..3c8ca06a 100644 --- a/.github/actions/appleapp-road-test/action.yml +++ b/.github/actions/appleapp-road-test/action.yml @@ -25,6 +25,11 @@ inputs: required: false default: 'true' + skip-setup: + description: 'Skip yarn install/build when the caller already prepared the monorepo (e.g. Expo preview workflow)' + required: false + default: 'false' + runs: using: composite steps: @@ -33,6 +38,7 @@ runs: shell: bash - name: Setup + if: inputs.skip-setup != 'true' uses: ./.github/actions/setup with: restore-turbo-cache: ${{ inputs.restore-turbo-cache }} diff --git a/.github/actions/prepare-android/action.yml b/.github/actions/prepare-android/action.yml index 19ddd82f..a8dcd7e7 100644 --- a/.github/actions/prepare-android/action.yml +++ b/.github/actions/prepare-android/action.yml @@ -23,7 +23,7 @@ inputs: default: 'false' gradle-workflow-job-context: - description: 'Segment Gradle cache per app/project (e.g. vanilla, expo54). Falls back to github.job when empty.' + description: 'Segment Gradle cache per app/project (e.g. vanilla, expo55). Falls back to github.job when empty.' required: false default: '' diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 33356cd8..cefa1172 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -19,6 +19,7 @@ runs: uses: actions/setup-node@65d868f8d4d85d7d4abb7de0875cde3fcc8798f5 # v6 with: node-version: 'lts/*' + check-latest: true cache: 'yarn' - name: Setup Node.js (no cache) @@ -26,6 +27,7 @@ runs: uses: actions/setup-node@65d868f8d4d85d7d4abb7de0875cde3fcc8798f5 # v6 with: node-version: 'lts/*' + check-latest: true package-manager-cache: false - name: Restore Turbo cache diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68af1389..03f99134 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,10 +22,11 @@ jobs: outputs: packages: ${{ steps.filter.outputs.packages }} rnapp: ${{ steps.filter.outputs.rnapp }} - expo54: ${{ steps.filter.outputs.expo54 }} expo55: ${{ steps.filter.outputs.expo55 }} + expo56: ${{ steps.filter.outputs.expo56 }} androidapp: ${{ steps.filter.outputs.androidapp }} appleapp: ${{ steps.filter.outputs.appleapp }} + gradle-plugins: ${{ steps.filter.outputs.gradle-plugins }} ci: ${{ steps.filter.outputs.ci }} steps: - name: Checkout @@ -41,18 +42,20 @@ jobs: rnapp: - 'apps/RNApp/**' - 'apps/brownfield-example-shared-tests/**' - expo54: - - 'apps/ExpoApp54/**' - - 'apps/brownfield-example-shared-tests/**' expo55: - 'apps/ExpoApp55/**' - 'apps/brownfield-example-shared-tests/**' + expo56: + - 'apps/ExpoApp56/**' + - 'apps/brownfield-example-shared-tests/**' androidapp: - 'apps/AndroidApp/**' - 'apps/brownfield-example-shared-tests/**' appleapp: - 'apps/AppleApp/**' - 'apps/brownfield-example-shared-tests/**' + gradle-plugins: + - 'gradle-plugins/**' ci: - '.github/**' @@ -137,17 +140,19 @@ jobs: if: | always() && ( - needs.filter.outputs.expo54 == 'true' || needs.filter.outputs.expo55 == 'true' || + needs.filter.outputs.expo56 == 'true' || needs.filter.outputs.androidapp == 'true' || needs.filter.outputs.packages == 'true' || + needs.filter.outputs.gradle-plugins == 'true' || needs.filter.outputs.ci == 'true' ) && (needs.build-lint.result == 'success' || needs.build-lint.result == 'skipped') strategy: matrix: include: - - version: '54' + - version: '55' + - version: '56' steps: - name: Checkout @@ -172,6 +177,7 @@ jobs: needs.filter.outputs.expo55 == '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') @@ -201,6 +207,7 @@ jobs: needs.filter.outputs.expo55 == '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') && @@ -220,6 +227,67 @@ jobs: e2e-apk-artifact-name: androidapp-expo55-e2e-apks e2e-artifact-name: detox-androidapp-expo55 + android-androidapp-expo56-build: + name: Build AndroidApp & Detox APKs (Expo 56) + runs-on: ubuntu-latest + timeout-minutes: 120 + needs: [filter, build-lint] + if: | + always() && + ( + needs.filter.outputs.expo56 == '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: Build Expo 56 AndroidApp Detox APKs + uses: ./.github/actions/androidapp-road-test + with: + flavor: expo56 + rn-project-path: apps/ExpoApp56 + rn-project-maven-path: com/callstack/rnbrownfield/demo/expoapp56/brownfieldlib + e2e-phase: build + e2e-apk-artifact-name: androidapp-expo56-e2e-apks + e2e-artifact-name: detox-androidapp-expo56 + + android-androidapp-expo56-e2e: + name: Detox E2E (AndroidApp - Expo 56) + runs-on: ubuntu-latest + timeout-minutes: 90 + needs: [filter, build-lint, android-androidapp-expo56-build] + if: | + always() && + ( + needs.filter.outputs.expo56 == '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') && + needs.android-androidapp-expo56-build.result == 'success' + + steps: + - name: Checkout + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + + - name: Run Expo 56 Detox E2E (prebuilt APKs) + uses: ./.github/actions/androidapp-road-test + with: + flavor: expo56 + rn-project-path: apps/ExpoApp56 + rn-project-maven-path: com/callstack/rnbrownfield/demo/expoapp56/brownfieldlib + e2e-phase: test + e2e-apk-artifact-name: androidapp-expo56-e2e-apks + e2e-artifact-name: detox-androidapp-expo56 + android-androidapp-vanilla: name: Android road test & E2E (AndroidApp - Vanilla) runs-on: ubuntu-latest @@ -231,6 +299,7 @@ jobs: needs.filter.outputs.rnapp == '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') @@ -283,8 +352,8 @@ jobs: if: | always() && ( - needs.filter.outputs.expo54 == 'true' || needs.filter.outputs.expo55 == 'true' || + needs.filter.outputs.expo56 == 'true' || needs.filter.outputs.appleapp == 'true' || needs.filter.outputs.packages == 'true' || needs.filter.outputs.ci == 'true' @@ -293,10 +362,10 @@ jobs: strategy: matrix: include: - - version: '54' - run-e2e: 'false' - version: '55' run-e2e: 'true' + - version: '56' + run-e2e: 'true' steps: - name: Checkout diff --git a/.github/workflows/expo-beta-road-test.yml b/.github/workflows/expo-preview-road-test.yml similarity index 62% rename from .github/workflows/expo-beta-road-test.yml rename to .github/workflows/expo-preview-road-test.yml index 0b28d818..b718ac6f 100644 --- a/.github/workflows/expo-beta-road-test.yml +++ b/.github/workflows/expo-preview-road-test.yml @@ -1,5 +1,5 @@ -name: Expo beta road test -run-name: Expo beta road test +name: Expo preview road test +run-name: Expo preview road test on: schedule: @@ -13,7 +13,7 @@ permissions: jobs: prepare: - name: Detect Expo beta to test + name: Detect Expo preview to test runs-on: ubuntu-latest outputs: latest_version: ${{ steps.finalize.outputs.latest_version }} @@ -22,11 +22,11 @@ jobs: - name: Checkout uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - name: Detect latest Expo beta + - name: Detect latest Expo preview id: detect - run: node --experimental-strip-types --no-warnings ./scripts/check-expo-beta.ts --github-output "$GITHUB_OUTPUT" --github-step-summary "$GITHUB_STEP_SUMMARY" + run: node --experimental-strip-types --no-warnings ./scripts/check-expo-preview.ts --github-output "$GITHUB_OUTPUT" --github-step-summary "$GITHUB_STEP_SUMMARY" - - name: Check whether this Expo beta was already tested + - name: Check whether this Expo preview was already tested id: tested if: steps.detect.outputs.latest_version != '' env: @@ -34,7 +34,7 @@ jobs: run: | artifact_id=$(gh api \ "/repos/${{ github.repository }}/actions/artifacts?per_page=100" \ - --jq '.artifacts[] | select(.expired == false) | select(.name == "expo-beta-tested-${{ steps.detect.outputs.latest_version }}") | .id' \ + --jq '.artifacts[] | select(.expired == false) | select(.name == "expo-preview-tested-${{ steps.detect.outputs.latest_version }}") | .id' \ | head -n 1) if [ -n "$artifact_id" ]; then @@ -61,7 +61,7 @@ jobs: } >> "$GITHUB_STEP_SUMMARY" android: - name: Android road test (Expo beta) + name: Android road test (Expo preview) runs-on: ubuntu-latest needs: prepare if: needs.prepare.outputs.should_test == 'true' @@ -69,8 +69,8 @@ jobs: - name: Checkout uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - name: Generate and apply Expo beta to ExpoAppBeta - run: node --experimental-strip-types --no-warnings ./scripts/check-expo-beta.ts --expo-version "${{ needs.prepare.outputs.latest_version }}" --apply --github-step-summary "$GITHUB_STEP_SUMMARY" + - name: Generate and apply Expo preview to ExpoAppPreview + run: node --experimental-strip-types --no-warnings ./scripts/check-expo-preview.ts --expo-version "${{ needs.prepare.outputs.latest_version }}" --apply --github-step-summary "$GITHUB_STEP_SUMMARY" - name: Setup monorepo uses: ./.github/actions/setup @@ -79,26 +79,28 @@ jobs: env: YARN_ENABLE_IMMUTABLE_INSTALLS: 'false' - - name: Install Expo beta dependencies + - name: Install Expo preview dependencies env: DETOX_DISABLE_POSTINSTALL: '1' + YARN_ENABLE_IMMUTABLE_INSTALLS: 'false' run: | - cd apps/ExpoAppBeta - npx expo install --fix + yarn workspace @callstack/brownfield-example-expo-app-preview exec expo install --fix + yarn install - - name: Rebuild packages after Expo beta dependency updates + - name: Rebuild packages after Expo preview dependency updates run: yarn build - - name: Run ExpoAppBeta -> AndroidApp road test + - name: Run ExpoAppPreview -> AndroidApp road test uses: ./.github/actions/androidapp-road-test with: - flavor: expobeta - rn-project-path: apps/ExpoAppBeta - rn-project-maven-path: com/callstack/rnbrownfield/demo/expobeta/brownfieldlib + flavor: expopreview + rn-project-path: apps/ExpoAppPreview + rn-project-maven-path: com/callstack/rnbrownfield/demo/expoapppreview/brownfieldlib restore-turbo-cache: 'false' + skip-setup: 'true' ios: - name: iOS road test (Expo beta) + name: iOS road test (Expo preview) runs-on: macos-26 needs: prepare if: needs.prepare.outputs.should_test == 'true' @@ -106,8 +108,8 @@ jobs: - name: Checkout uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - name: Generate and apply Expo beta to ExpoAppBeta - run: node --experimental-strip-types --no-warnings ./scripts/check-expo-beta.ts --expo-version "${{ needs.prepare.outputs.latest_version }}" --apply --github-step-summary "$GITHUB_STEP_SUMMARY" + - name: Generate and apply Expo preview to ExpoAppPreview + run: node --experimental-strip-types --no-warnings ./scripts/check-expo-preview.ts --expo-version "${{ needs.prepare.outputs.latest_version }}" --apply --github-step-summary "$GITHUB_STEP_SUMMARY" - name: Setup monorepo uses: ./.github/actions/setup @@ -116,25 +118,27 @@ jobs: env: YARN_ENABLE_IMMUTABLE_INSTALLS: 'false' - - name: Install Expo beta dependencies + - name: Install Expo preview dependencies env: DETOX_DISABLE_POSTINSTALL: '1' + YARN_ENABLE_IMMUTABLE_INSTALLS: 'false' run: | - cd apps/ExpoAppBeta - npx expo install --fix + yarn workspace @callstack/brownfield-example-expo-app-preview exec expo install --fix + yarn install - - name: Rebuild packages after Expo beta dependency updates + - name: Rebuild packages after Expo preview dependency updates run: yarn build - - name: Run ExpoAppBeta -> AppleApp road test + - name: Run ExpoAppPreview -> AppleApp road test uses: ./.github/actions/appleapp-road-test with: - variant: expobeta - rn-project-path: apps/ExpoAppBeta + variant: expopreview + rn-project-path: apps/ExpoAppPreview restore-turbo-cache: 'false' + skip-setup: 'true' record-success: - name: Record tested Expo beta + name: Record tested Expo preview runs-on: ubuntu-latest needs: [prepare, android, ios] if: | @@ -142,20 +146,20 @@ jobs: needs.android.result == 'success' && needs.ios.result == 'success' steps: - - name: Create Expo beta success marker + - name: Create Expo preview success marker run: | - mkdir -p expo-beta-test-result - printf '%s\n' '${{ needs.prepare.outputs.latest_version }}' > expo-beta-test-result/version.txt + mkdir -p expo-preview-test-result + printf '%s\n' '${{ needs.prepare.outputs.latest_version }}' > expo-preview-test-result/version.txt - - name: Upload Expo beta success marker + - name: Upload Expo preview success marker uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: expo-beta-tested-${{ needs.prepare.outputs.latest_version }} - path: expo-beta-test-result/version.txt + name: expo-preview-tested-${{ needs.prepare.outputs.latest_version }} + path: expo-preview-test-result/version.txt retention-days: 90 create-issue-on-failure: - name: Create issue on Expo beta failure + name: Create issue on Expo preview failure runs-on: ubuntu-latest needs: [prepare, android, ios] if: | @@ -166,24 +170,24 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - issue_title="Expo beta road test failed for ${{ needs.prepare.outputs.latest_version }}" + issue_title="Expo preview road test failed for ${{ needs.prepare.outputs.latest_version }}" existing_issue_number=$(gh issue list \ --search "${issue_title} in:title state:open" \ --json number \ --jq '.[0].number // ""') if [ -n "$existing_issue_number" ]; then - gh issue comment "$existing_issue_number" --body $'A new failure was detected.\n\n- Expo beta version: `${{ needs.prepare.outputs.latest_version }}`\n- Android result: `${{ needs.android.result }}`\n- iOS result: `${{ needs.ios.result }}`\n- Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}' + gh issue comment "$existing_issue_number" --body $'A new failure was detected.\n\n- Expo preview version: `${{ needs.prepare.outputs.latest_version }}`\n- Android result: `${{ needs.android.result }}`\n- iOS result: `${{ needs.ios.result }}`\n- Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}' exit 0 fi gh issue create \ --title "$issue_title" \ - --body $'The Expo beta road test failed.\n\n- Expo beta version: `${{ needs.prepare.outputs.latest_version }}`\n- Android result: `${{ needs.android.result }}`\n- iOS result: `${{ needs.ios.result }}`\n- Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}' \ + --body $'The Expo preview road test failed.\n\n- Expo preview version: `${{ needs.prepare.outputs.latest_version }}`\n- Android result: `${{ needs.android.result }}`\n- iOS result: `${{ needs.ios.result }}`\n- Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}' \ --label question summarize: - name: Summarize Expo beta road test + name: Summarize Expo preview road test runs-on: ubuntu-latest needs: [prepare, android, ios, record-success, create-issue-on-failure] if: always() @@ -191,14 +195,14 @@ jobs: - name: Write workflow summary run: | { - echo "## Expo beta road test results" + echo "## Expo preview road test results" echo - echo "- Expo beta version: ${{ needs.prepare.outputs.latest_version || 'not found' }}" + echo "- Expo preview version: ${{ needs.prepare.outputs.latest_version || 'not found' }}" echo "- Android result: ${{ needs.android.result || 'skipped' }}" echo "- iOS result: ${{ needs.ios.result || 'skipped' }}" echo if [ "${{ needs.prepare.outputs.should_test }}" != "true" ]; then - echo "No new untested Expo beta required testing." + echo "No new untested Expo preview required testing." else echo "- Success marker uploaded: ${{ needs.record-success.result == 'success' && 'yes' || 'no' }}" echo "- Issue created/updated on failure: ${{ needs.create-issue-on-failure.result == 'success' && 'yes' || 'no' }}" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c2e4e349..e8131c3d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,12 +24,11 @@ jobs: with: disable-cache: 'true' - - name: Build run: yarn build - name: Create Release Pull Request or Publish to NPM - uses: changesets/action@e9cc34b540dd3ad1b030c57fd97269e8f6ad905a # v1.4.9 + uses: changesets/action@a45c4d594aa4e2c509dc14a9f2b3b67ba3780d0d # v1.9.0 with: version: yarn ci:version publish: yarn ci:publish diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c22e915..19cecb66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,80 @@ _History prior to 3.7.0 is available in the per-package CHANGELOG files._ +## 4.2.0 + +### Minor Changes + +- [#413](https://github.com/callstack/react-native-brownfield/pull/413) [`39cf6a7`](https://github.com/callstack/react-native-brownfield/commit/39cf6a751c62ee701c96468a5a701c0bdf96463b) Thanks [@hurali97](https://github.com/hurali97)! - feat: add option to use local maven + +### Patch Changes + +- Updated dependencies [[`39cf6a7`](https://github.com/callstack/react-native-brownfield/commit/39cf6a751c62ee701c96468a5a701c0bdf96463b)]: + - @callstack/brownfield-cli@4.2.0 + +## 4.1.0 + +### Minor Changes + +- [#367](https://github.com/callstack/react-native-brownfield/pull/367) [`dd1082a`](https://github.com/callstack/react-native-brownfield/commit/dd1082a42c83f2cb8fd7f03df05a6e0a13e8833c) Thanks [@hurali97](https://github.com/hurali97)! - refactor: remove deprecated APIs + +### Patch Changes + +- Updated dependencies [[`dd1082a`](https://github.com/callstack/react-native-brownfield/commit/dd1082a42c83f2cb8fd7f03df05a6e0a13e8833c)]: + - @callstack/brownfield-cli@4.1.0 + +- [#417](https://github.com/callstack/react-native-brownfield/pull/417) [`28b534e`](https://github.com/callstack/react-native-brownfield/commit/28b534ea3f1bfd298b89049a6733eb23b9f7d9fc) Thanks [@hurali97](https://github.com/hurali97)! - fix: merge classes to contain third party libs classes + +## 4.0.0 + +### Major Changes + +- [#407](https://github.com/callstack/react-native-brownfield/pull/407) [`dee9559`](https://github.com/callstack/react-native-brownfield/commit/dee9559d6a1a1169c0824542ec8d2ea5ef6475e7) Thanks [@hurali97](https://github.com/hurali97)! - feat: drop support for expo sdk 54 + +### Patch Changes + +- Updated dependencies [[`dee9559`](https://github.com/callstack/react-native-brownfield/commit/dee9559d6a1a1169c0824542ec8d2ea5ef6475e7)]: + - @callstack/brownfield-cli@4.0.0 + +- [#414](https://github.com/callstack/react-native-brownfield/pull/414) [`803f8ca`](https://github.com/callstack/react-native-brownfield/commit/803f8ca488515d7589d3b36e4ebb57d77df1d43d) Thanks [@artus9033](https://github.com/artus9033)! - fix: duplicated JNI libs on cold publish + +## 3.15.0 + +### Minor Changes + +- [#410](https://github.com/callstack/react-native-brownfield/pull/410) [`03c2496`](https://github.com/callstack/react-native-brownfield/commit/03c2496989fdafdc0863a97f01df9b7f5cd78a55) Thanks [@hurali97](https://github.com/hurali97)! - bump brownfield-gradle-plugin + +### Patch Changes + +- Updated dependencies []: + - @callstack/brownfield-cli@3.15.0 + +## 3.14.0 + +### Minor Changes + +- [#360](https://github.com/callstack/react-native-brownfield/pull/360) [`10ff597`](https://github.com/callstack/react-native-brownfield/commit/10ff597c057c04aa093b4e5ae8c5334b169d3d56) Thanks [@adamTrz](https://github.com/adamTrz)! - Expo SDK 56 support + +### Patch Changes + +- Updated dependencies [[`10ff597`](https://github.com/callstack/react-native-brownfield/commit/10ff597c057c04aa093b4e5ae8c5334b169d3d56)]: + - @callstack/brownfield-cli@3.14.0 + +## 3.13.2 + +### Patch Changes + +- Updated dependencies [[`8e90842`](https://github.com/callstack/react-native-brownfield/commit/8e90842291348dcb0542a6787f5cfbb1017532dd), [`3475c3d`](https://github.com/callstack/react-native-brownfield/commit/3475c3db375988ebd63ce01bfd93f4dbb1a55e8d), [`4088c01`](https://github.com/callstack/react-native-brownfield/commit/4088c01a069306565dd3e279d9132f5dbe861d0b)]: + - @callstack/brownfield-cli@3.13.2 + +- [#398](https://github.com/callstack/react-native-brownfield/pull/398) [`8e90842`](https://github.com/callstack/react-native-brownfield/commit/8e90842291348dcb0542a6787f5cfbb1017532dd) Thanks [@artus9033](https://github.com/artus9033)! - feat: support brownfield unified config file in Expo + +- [#402](https://github.com/callstack/react-native-brownfield/pull/402) [`3475c3d`](https://github.com/callstack/react-native-brownfield/commit/3475c3db375988ebd63ce01bfd93f4dbb1a55e8d) Thanks [@artus9033](https://github.com/artus9033)! - feat: support local BGP in Expo config plugin + +- [#397](https://github.com/callstack/react-native-brownfield/pull/397) [`4088c01`](https://github.com/callstack/react-native-brownfield/commit/4088c01a069306565dd3e279d9132f5dbe861d0b) Thanks [@artus9033](https://github.com/artus9033)! - fix: generate config schema with descriptions, add more descriptions + +- [#401](https://github.com/callstack/react-native-brownfield/pull/401) [`c4410f6`](https://github.com/callstack/react-native-brownfield/commit/c4410f6af4c781cf3513ba55d03fa1b1055a443b) Thanks [@artus9033](https://github.com/artus9033)! - fix: brownfield Gradle Plugin not to depend on \*UpdatesResources task from expo-updates if it is absent + ## 3.13.1 ### Patch Changes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 216d4e3f..f4ef036f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,7 +29,7 @@ We use [changesets](https://github.com/changesets/changesets) to make it easier - `lint` - runs linting on all JS/TS source files in the monorepo _[Turbo]_ - `gradle-plugin:lint` - runs linting on the Brownfield Gradle plugin source code - `typecheck` - runs TypeScript type checking on all TS source files in the monorepo _[Turbo]_ -- `test:apps` - runs Jest for the React Native example apps under `apps/` (Expo 54, Expo 55, plain RN) _[Turbo]_ +- `test:apps` - runs Jest for the React Native example apps under `apps/` (Expo 55, plain RN) _[Turbo]_ - `build` - runs all `build*` tasks in the Turbo repo - see below for more details _[Turbo]_ - `dev` - runs all `dev` tasks in all workspaces - `brownfield:plugin:publish:local` - publishes the Brownfield Gradle plugin to your local Maven repository for testing purposes @@ -38,11 +38,9 @@ We use [changesets](https://github.com/changesets/changesets) to make it easier - `build:example:android-rn` - builds the example React Native app for Android (`apps/RNApp/android`) - `build:example:ios-rn` - builds the example React Native app for iOS (`apps/RNApp/ios`) - `build:example:android-consumer:expo55` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the Expo 55 RN app (`apps/ExpoApp55`) artifact -- `build:example:android-consumer:expo54` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the Expo 54 RN app (`apps/ExpoApp54`) artifact - `build:example:android-consumer:vanilla` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the vanilla RN app (`apps/RNApp`) artifact - `build:example:ios-consumer:expo` - alias for `build:example:ios-consumer:expo55` - `build:example:ios-consumer:expo55` - builds the `Brownfield Apple App (ExpoApp55)` target via scheme **Brownfield Apple App Expo 55** (`Release`) -- `build:example:ios-consumer:expo54` - builds the `Brownfield Apple App (ExpoApp54)` target via scheme **Brownfield Apple App Expo 54** (`Release`) - `build:example:ios-consumer:vanilla` - builds the `Brownfield Apple App (RNApp)` target via scheme **Brownfield Apple App Vanilla** (`Release Vanilla`) ## Running demo apps @@ -65,20 +63,17 @@ There are 2 brownfield host apps. > Each of the scripts below requires you to **first** package the consumed RN application with `yarn brownfield:package:ios`, e.g. `cd apps/ExpoApp55 && yarn brownfield:package:ios`. - `apps/AndroidApp` - for Android - - `build:example:android-consumer:expo54` - consumes Expo 54 - `build:example:android-consumer:expo55` - consumes Expo 55 - `build:example:android-consumer:vanilla` - consumes the vanilla `RNApp` -- `apps/AppleApp` - for Apple (three Xcode targets, each with its own shared scheme) - - `build:example:ios-consumer:expo54` — target `Brownfield Apple App (ExpoApp54)`, scheme **Brownfield Apple App Expo 54** +- `apps/AppleApp` - for Apple (two Xcode targets, each with its own shared scheme) - `build:example:ios-consumer:expo55` (or `expo`) — target `Brownfield Apple App (ExpoApp55)`, scheme **Brownfield Apple App Expo 55** - `build:example:ios-consumer:vanilla` — target `Brownfield Apple App (RNApp)`, scheme **Brownfield Apple App Vanilla** -For iOS, these scripts validate the legacy direct-XCFramework integration path. Each script uses the previously packaged artifacts from the respective directory (`apps/RNApp`, `apps/ExpoApp54`, or `apps/ExpoApp55`), invokes `prepareXCFrameworks.js` to copy XCFrameworks into `apps/AppleApp/package`, then runs `xcodebuild` against the matching scheme. The Xcode project reads fixed paths under `package/` (for example `package/BrownfieldLib.xcframework`). +For iOS, these scripts validate the legacy direct-XCFramework integration path. Each script uses the previously packaged artifacts from the respective directory (`apps/RNApp` or `apps/ExpoApp55`), invokes `prepareXCFrameworks.js` to copy XCFrameworks into `apps/AppleApp/package`, then runs `xcodebuild` against the matching scheme. The Xcode project reads fixed paths under `package/` (for example `package/BrownfieldLib.xcframework`). | 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:expo54` | `ExpoApp54` | `Brownfield Apple App (ExpoApp54)` | Brownfield Apple App Expo 54 | `Release` | | `build:example:ios-consumer:expo55` | `ExpoApp55` | `Brownfield Apple App (ExpoApp55)` | Brownfield Apple App Expo 55 | `Release` | > [!IMPORTANT] @@ -94,11 +89,9 @@ The local Swift Package Manager flow is separate from `prepareXCFrameworks.js`. 2. Open `apps/AppleApp/Brownfield Apple App.xcodeproj`. 3. Select the host scheme you want to validate: - `Brownfield Apple App Vanilla` - - `Brownfield Apple App Expo 54` - `Brownfield Apple App Expo 55` 4. In Xcode, go to `Package Dependencies`, click `+`, choose `Add Local...`, and select the generated package folder: - `apps/RNApp/ios/.brownfield/package/build` - - `apps/ExpoApp54/ios/.brownfield/package/build` - `apps/ExpoApp55/ios/.brownfield/package/build` 5. Add the `BrownfieldLib` product to the matching AppleApp target. 6. Remove old direct `package/*.xcframework` references from that target if you are switching from the legacy direct-XCFramework path. @@ -120,10 +113,9 @@ Per example app (run from the repo root): | Command | App | | --------------------------------------------------------------- | --------------------------------- | | `yarn workspace @callstack/brownfield-example-rn-app test` | Plain React Native (`apps/RNApp`) | -| `yarn workspace @callstack/brownfield-example-expo-app-54 test` | Expo SDK 54 (`apps/ExpoApp54`) | | `yarn workspace @callstack/brownfield-example-expo-app-55 test` | Expo SDK 55 (`apps/ExpoApp55`) | -Package-level scripts (`yarn test` inside `apps/RNApp`, `apps/ExpoApp54`, or `apps/ExpoApp55`) invoke Jest with each app’s `jest.config.js`. +Package-level scripts (`yarn test` inside `apps/RNApp` or `apps/ExpoApp55`) invoke Jest with each app’s `jest.config.js`. The native-only sample apps (`apps/AppleApp`, `apps/AndroidApp`) use their platform test runners (Xcode / Gradle), not Jest. @@ -137,7 +129,7 @@ E2E runs without Metro: the Debug simulator build embeds `main.jsbundle` (`FORCE | Path | What it exercises | Typical flow | | ----------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | -| RN host app (`RNApp`, `ExpoApp54`, `ExpoApp55`) | Brownfield RN app running as the simulator target | `expo prebuild` / pods → Detox build → Detox test | +| RN host app (`RNApp`, `ExpoApp55`) | Brownfield RN app running as the simulator target | `expo prebuild` / pods → Detox build → Detox test | | native host app (`AppleApp`) | Native host app consuming a packaged `BrownfieldLib` XCFramework | `brownfield:package:ios` → copy XCFrameworks into `AppleApp/package` → Detox build → Detox test | Per-app Detox scripts (run from the app directory): @@ -145,7 +137,7 @@ Per-app Detox scripts (run from the app directory): | App | Build | Test | Shared spec | | ------------------------- | --------------------------- | -------------------------- | ---------------------------------- | | `RNApp` | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `rnAppBrownfield.e2e.js` | -| `ExpoApp54` / `ExpoApp55` | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `expoPostMessageBrownfield.e2e.js` | +| `ExpoApp55` | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `expoPostMessageBrownfield.e2e.js` | | `AppleApp` (vanilla) | `yarn e2e:build:ios` | `yarn e2e:test:ios` | `appleAppBrownfield.e2e.js` | | `AppleApp` (Expo 55) | `yarn e2e:build:ios:expo55` | `yarn e2e:test:ios:expo55` | `appleAppExpoBrownfield.e2e.js` | @@ -156,7 +148,6 @@ iOS Detox E2E runs in [`.github/workflows/ci.yml`](.github/workflows/ci.yml) via | Job | E2E | Notes | | ----------------------------- | --- | ---------------------------------------- | | `ios-appleapp-vanilla` | Yes | `RNApp` → package → `AppleApp` Detox | -| `ios-appleapp-expo` (Expo 54) | No | Road test only (Release build) | | `ios-appleapp-expo` (Expo 55) | Yes | `ExpoApp55` → package → `AppleApp` Detox | On failure, CI uploads `apps/AppleApp/e2e-artifacts/` as a workflow artifact (`detox-appleapp-*-ios-recordings`). @@ -170,7 +161,6 @@ From the repo root (macOS + Xcode + Simulator required). All wrap `scripts/ci-lo | Command | Mirrors | | --------------------------------------- | -------------------------------- | | `yarn ci:local:rnapp:e2e:ios` | RN host app E2E (`apps/RNApp`) | -| `yarn ci:local:expo54:e2e:ios` | Expo 54 host app E2E | | `yarn ci:local:expo55:e2e:ios` | Expo 55 host app E2E | | `yarn ci:local:appleapp:e2e:ios` | CI `ios-appleapp-vanilla` | | `yarn ci:local:appleapp:e2e:ios:expo55` | CI `ios-appleapp-expo` (Expo 55) | diff --git a/apps/.gitignore b/apps/.gitignore new file mode 100644 index 00000000..853d1748 --- /dev/null +++ b/apps/.gitignore @@ -0,0 +1 @@ +ExpoAppPreview diff --git a/apps/AndroidApp/.detoxrc.expo56.cjs b/apps/AndroidApp/.detoxrc.expo56.cjs new file mode 100644 index 00000000..2bc16487 --- /dev/null +++ b/apps/AndroidApp/.detoxrc.expo56.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: 'expo56', + detoxConfiguration: 'android.emu.release.expo56', + jestConfigPath: 'e2e/jest.config.expo56.cjs', +}); diff --git a/apps/AndroidApp/app/build.gradle.kts b/apps/AndroidApp/app/build.gradle.kts index ad02d458..6494244b 100644 --- a/apps/AndroidApp/app/build.gradle.kts +++ b/apps/AndroidApp/app/build.gradle.kts @@ -31,13 +31,16 @@ android { flavorDimensions += "app" productFlavors { - create("expo54") { + create("expo55") { dimension = "app" } - create("expo55") { + create("expo57") { + dimension = "app" + } + create("expo56") { dimension = "app" } - create("expobeta") { + create("expopreview") { dimension = "app" } create("vanilla") { @@ -77,9 +80,10 @@ dependencies { implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.compose.material3) implementation(libs.androidx.appcompat) + add("expo57Implementation", libs.brownfieldlib.expo57) add("expo55Implementation", libs.brownfieldlib.expo55) - add("expobetaImplementation", libs.brownfieldlib.expobeta) - add("expo54Implementation", libs.brownfieldlib.expo54) + add("expo56Implementation", libs.brownfieldlib.expo56) + add("expopreviewImplementation", libs.brownfieldlib.expopreview) add("vanillaImplementation", libs.brownfieldlib.vanilla) implementation(libs.androidx.fragment.compose) diff --git a/apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt similarity index 57% rename from apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt rename to apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt index d54e8c19..c9e8fa11 100644 --- a/apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt +++ b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt @@ -1,4 +1,4 @@ package com.callstack.brownfield.android.example -typealias BrownfieldStore = com.callstack.rnbrownfield.demo.expoapp54.BrownfieldStore -typealias User = com.callstack.rnbrownfield.demo.expoapp54.User +typealias BrownfieldStore = com.callstack.rnbrownfield.demo.expoapp56.BrownfieldStore +typealias User = com.callstack.rnbrownfield.demo.expoapp56.User diff --git a/apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt similarity index 73% rename from apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt rename to apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt index ef91af22..dfd59f51 100644 --- a/apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt +++ b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt @@ -2,5 +2,5 @@ package com.callstack.brownfield.android.example object ReactNativeConstants { const val MAIN_MODULE_NAME = "main" - const val APP_NAME = "Android (Expo 54)" + const val APP_NAME = "Android (Expo 56)" } diff --git a/apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt similarity index 76% rename from apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt rename to apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt index 4fb0f2c0..c317ce58 100644 --- a/apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt +++ b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt @@ -1,3 +1,3 @@ package com.callstack.brownfield.android.example -typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.expoapp54.ReactNativeHostManager +typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.expoapp56.ReactNativeHostManager diff --git a/apps/AndroidApp/app/src/expo57/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt b/apps/AndroidApp/app/src/expo57/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt new file mode 100644 index 00000000..69c7f5c0 --- /dev/null +++ b/apps/AndroidApp/app/src/expo57/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt @@ -0,0 +1,4 @@ +package com.callstack.brownfield.android.example + +typealias BrownfieldStore = com.callstack.rnbrownfield.demo.expoapp57.BrownfieldStore +typealias User = com.callstack.rnbrownfield.demo.expoapp57.User diff --git a/apps/AndroidApp/app/src/expo57/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt b/apps/AndroidApp/app/src/expo57/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt new file mode 100644 index 00000000..45f2d46d --- /dev/null +++ b/apps/AndroidApp/app/src/expo57/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt @@ -0,0 +1,6 @@ +package com.callstack.brownfield.android.example + +object ReactNativeConstants { + const val MAIN_MODULE_NAME = "main" + const val APP_NAME = "Android (Expo 57)" +} diff --git a/apps/AndroidApp/app/src/expo57/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt b/apps/AndroidApp/app/src/expo57/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt new file mode 100644 index 00000000..97088718 --- /dev/null +++ b/apps/AndroidApp/app/src/expo57/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt @@ -0,0 +1,3 @@ +package com.callstack.brownfield.android.example + +typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.expoapp57.ReactNativeHostManager diff --git a/apps/AndroidApp/app/src/expopreview/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt b/apps/AndroidApp/app/src/expopreview/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt new file mode 100644 index 00000000..d3f31576 --- /dev/null +++ b/apps/AndroidApp/app/src/expopreview/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt @@ -0,0 +1,4 @@ +package com.callstack.brownfield.android.example + +typealias BrownfieldStore = com.callstack.rnbrownfield.demo.expoapppreview.BrownfieldStore +typealias User = com.callstack.rnbrownfield.demo.expoapppreview.User diff --git a/apps/AndroidApp/app/src/expopreview/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt b/apps/AndroidApp/app/src/expopreview/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt new file mode 100644 index 00000000..61214dd5 --- /dev/null +++ b/apps/AndroidApp/app/src/expopreview/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt @@ -0,0 +1,6 @@ +package com.callstack.brownfield.android.example + +object ReactNativeConstants { + const val MAIN_MODULE_NAME = "main" + const val APP_NAME = "Android (Expo Preview)" +} diff --git a/apps/AndroidApp/app/src/expopreview/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt b/apps/AndroidApp/app/src/expopreview/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt new file mode 100644 index 00000000..d99af6c6 --- /dev/null +++ b/apps/AndroidApp/app/src/expopreview/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt @@ -0,0 +1,3 @@ +package com.callstack.brownfield.android.example + +typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.expoapppreview.ReactNativeHostManager diff --git a/apps/AndroidApp/app/src/main/java/com/callstack/brownfield/android/example/BrownfieldApplication.kt b/apps/AndroidApp/app/src/main/java/com/callstack/brownfield/android/example/BrownfieldApplication.kt index c1e83723..50363334 100644 --- a/apps/AndroidApp/app/src/main/java/com/callstack/brownfield/android/example/BrownfieldApplication.kt +++ b/apps/AndroidApp/app/src/main/java/com/callstack/brownfield/android/example/BrownfieldApplication.kt @@ -6,19 +6,16 @@ import com.callstack.brownie.registerStoreIfNeeded import com.callstack.reactnativebrownfield.ReactNativeBrownfield import com.facebook.react.ReactApplication import com.facebook.react.ReactHost -import com.facebook.react.ReactNativeHost /** * Detox expects a [ReactApplication] so it can await the embedded RN context during E2E runs. * RN is initialized at process start (embedded AAR bundle — no Metro). - * - * We should not have React internals import in a native Android app and should only rely on *ReactNativeHostManager or ReactNativeBrownfield, however, since this app is a testing app and we are *using Detox as E2E testing driver, we are making that trade-off. + * + * We should not have React internals import in a native Android app and should only rely on + * ReactNativeHostManager or ReactNativeBrownfield; since this app is a testing app and we are + * using Detox as E2E testing driver, we are making that trade-off. */ class BrownfieldApplication : Application(), ReactApplication { - @Suppress("DEPRECATION") - override val reactNativeHost: ReactNativeHost - get() = ReactNativeHostManager.reactNativeHost - override val reactHost: ReactHost get() = ReactNativeBrownfield.shared.reactHost diff --git a/apps/AndroidApp/app/src/main/java/com/callstack/brownfield/android/example/MainActivity.kt b/apps/AndroidApp/app/src/main/java/com/callstack/brownfield/android/example/MainActivity.kt index b280d6b7..c6107304 100644 --- a/apps/AndroidApp/app/src/main/java/com/callstack/brownfield/android/example/MainActivity.kt +++ b/apps/AndroidApp/app/src/main/java/com/callstack/brownfield/android/example/MainActivity.kt @@ -1,5 +1,6 @@ package com.callstack.brownfield.android.example +import com.callstack.brownie.registerStoreIfNeeded import android.app.Activity import android.content.Intent import android.content.res.Configuration @@ -8,6 +9,7 @@ import android.os.Bundle import android.widget.Toast import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -18,7 +20,9 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable @@ -30,8 +34,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.tooling.preview.Preview @@ -44,11 +46,10 @@ import com.callstack.brownfield.android.example.ui.theme.AndroidBrownfieldAppThe import com.callstack.nativebrownfieldnavigation.BrownfieldNavigationDelegate import com.callstack.nativebrownfieldnavigation.BrownfieldNavigationManager import com.callstack.nativebrownfieldnavigation.UserType -import com.callstack.reactnativebrownfield.ReactNativeBrownfield import com.callstack.reactnativebrownfield.ReactNativeFragment import com.callstack.reactnativebrownfield.constants.ReactNativeFragmentArgNames -import com.facebook.react.ReactInstanceEventListener -import com.facebook.react.bridge.ReactContext +import com.facebook.react.bridge.Callback +import com.facebook.react.bridge.Promise class MainActivity : AppCompatActivity(), BrownfieldNavigationDelegate { private val isDetoxE2E: Boolean @@ -68,6 +69,11 @@ class MainActivity : AppCompatActivity(), BrownfieldNavigationDelegate { } } + override fun onPause() { + BrownfieldNavigationManager.clearDelegate() + super.onPause() + } + override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) if (!hasFocus && isDetoxE2E) { @@ -75,17 +81,29 @@ class MainActivity : AppCompatActivity(), BrownfieldNavigationDelegate { } } - override fun onDestroy() { - BrownfieldNavigationManager.clearDelegate() - super.onDestroy() - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(null) enableEdgeToEdge() if (savedInstanceState == null) { - showReactNativeLoadedToastWhenReady() + ReactNativeHostManager.initialize(application) { + if (!isDetoxE2E) { + Toast.makeText( + this, + "React Native has been loaded", + Toast.LENGTH_LONG + ).show() + } + } + + registerStoreIfNeeded( + storeName = BrownfieldStore.STORE_NAME + ) { + BrownfieldStore( + counter = 0.0, + user = User(name = "Username") + ) + } } setContent { @@ -106,29 +124,6 @@ class MainActivity : AppCompatActivity(), BrownfieldNavigationDelegate { } } - private fun showReactNativeLoadedToastWhenReady() { - if (isDetoxE2E) { - return - } - - val reactHost = ReactNativeBrownfield.shared.reactHost - reactHost.currentReactContext?.let { - Toast.makeText(this, "React Native has been loaded", Toast.LENGTH_LONG).show() - return - } - - reactHost.addReactInstanceEventListener(object : ReactInstanceEventListener { - override fun onReactContextInitialized(context: ReactContext) { - Toast.makeText( - this@MainActivity, - "React Native has been loaded", - Toast.LENGTH_LONG - ).show() - reactHost.removeReactInstanceEventListener(this) - } - }) - } - override fun navigateToSettings(user: UserType) { startActivity(Intent(this, SettingsActivity::class.java)) } @@ -141,6 +136,27 @@ class MainActivity : AppCompatActivity(), BrownfieldNavigationDelegate { ) ) } + + override fun requestNativeConfirmation(title: String, promise: Promise) { + runOnUiThread { + AlertDialog.Builder(this) + .setTitle(title) + .setPositiveButton("OK") { _, _ -> promise.resolve(true) } + .setNegativeButton("Cancel") { _, _ -> promise.resolve(false) } + .setCancelable(false) + .show() + } + } + + override fun showNativeBanner(message: String, onDismiss: Callback) { + runOnUiThread { + AlertDialog.Builder(this) + .setMessage(message) + .setPositiveButton("Dismiss") { _, _ -> onDismiss.invoke() } + .setCancelable(false) + .show() + } + } } @Composable diff --git a/apps/ExpoApp54/e2e/jest.config.cjs b/apps/AndroidApp/e2e/jest.config.expo56.cjs similarity index 72% rename from apps/ExpoApp54/e2e/jest.config.cjs rename to apps/AndroidApp/e2e/jest.config.expo56.cjs index 9d780af8..c66afa2a 100644 --- a/apps/ExpoApp54/e2e/jest.config.cjs +++ b/apps/AndroidApp/e2e/jest.config.expo56.cjs @@ -5,10 +5,11 @@ const { module.exports = createDetoxJestConfig({ e2eDir: __dirname, + testTimeout: 600_000, testMatch: [ path.join( __dirname, - '../../brownfield-example-shared-tests/e2e/expoPostMessageBrownfield.e2e.js' + '../../brownfield-example-shared-tests/e2e/androidAppExpoBrownfield.e2e.js' ), ], }); diff --git a/apps/AndroidApp/gradle/libs.versions.toml b/apps/AndroidApp/gradle/libs.versions.toml index f52bd562..a3796e68 100644 --- a/apps/AndroidApp/gradle/libs.versions.toml +++ b/apps/AndroidApp/gradle/libs.versions.toml @@ -16,9 +16,10 @@ gson = "2.13.2" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +brownfieldlib-expo57 = { module = "com.callstack.rnbrownfield.demo.expoapp57:brownfieldlib", version.ref = "brownfieldlib" } +brownfieldlib-expo56 = { module = "com.callstack.rnbrownfield.demo.expoapp56:brownfieldlib", version.ref = "brownfieldlib" } brownfieldlib-expo55 = { module = "com.callstack.rnbrownfield.demo.expoapp55:brownfieldlib", version.ref = "brownfieldlib" } -brownfieldlib-expobeta = { module = "com.callstack.rnbrownfield.demo.expobeta:brownfieldlib", version.ref = "brownfieldlib" } -brownfieldlib-expo54 = { module = "com.callstack.rnbrownfield.demo.expoapp54: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" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } @@ -41,4 +42,3 @@ gson = { module = "com.google.code.gson:gson", version.ref = "gson" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } - diff --git a/apps/AndroidApp/package.json b/apps/AndroidApp/package.json index 219c55c4..1fd741a3 100644 --- a/apps/AndroidApp/package.json +++ b/apps/AndroidApp/package.json @@ -3,17 +3,21 @@ "version": "0.0.1", "private": true, "scripts": { - "build:example:android-consumer:expo": "./gradlew assembleExpo55Release", + "build:example:android-consumer:expo": "./gradlew assembleExpo57Release", + "build:example:android-consumer:expo57": "./gradlew assembleExpo57Release", + "build:example:android-consumer:expo56": "./gradlew assembleExpo56Release", "build:example:android-consumer:expo55": "./gradlew assembleExpo55Release", - "build:example:android-consumer:expobeta": "./gradlew assembleExpobetaRelease", - "build:example:android-consumer:expo54": "./gradlew assembleExpo54Release", + "build:example:android-consumer:expopreview": "./gradlew assembleExpopreviewRelease", "build:example:android-consumer:vanilla": "./gradlew assembleVanillaRelease", "e2e:build:android": "detox build --configuration android.emu.release", "e2e:test:android": "detox test --configuration android.emu.release", "e2e:build:android:expo55": "detox build --config-path ./.detoxrc.expo55.cjs --configuration android.emu.release.expo55", "e2e:test:android:expo55": "detox test --config-path ./.detoxrc.expo55.cjs --configuration android.emu.release.expo55", + "e2e:build:android:expo56": "detox build --config-path ./.detoxrc.expo56.cjs --configuration android.emu.release.expo56", + "e2e:test:android:expo56": "detox test --config-path ./.detoxrc.expo56.cjs --configuration android.emu.release.expo56", "ci:local:e2e:android": "bash ../../scripts/ci-local-androidapp-android-e2e.sh", - "ci:local:e2e:android:expo55": "bash ../../scripts/ci-local-androidapp-android-e2e.sh --variant expo55" + "ci:local:e2e:android:expo55": "bash ../../scripts/ci-local-androidapp-android-e2e.sh --variant expo55", + "ci:local:e2e:android:expo56": "bash ../../scripts/ci-local-androidapp-android-e2e.sh --variant expo56" }, "devDependencies": { "@callstack/brownfield-example-shared-tests": "workspace:^", diff --git a/apps/AppleApp/.detoxrc.expo56.cjs b/apps/AppleApp/.detoxrc.expo56.cjs new file mode 100644 index 00000000..dc21d80f --- /dev/null +++ b/apps/AppleApp/.detoxrc.expo56.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('expo56'); + +/** @type {import('detox').DetoxConfig} */ +module.exports = createAppleAppIosSimDebugDetoxConfig({ + scheme: variant.scheme, + configuration: variant.configuration, + appBinaryName: variant.appBinaryName, + detoxConfiguration: variant.detoxConfiguration, + jestConfigPath: 'e2e/jest.config.expo56.cjs', +}); diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj index a8cc22ca..03014749 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj @@ -7,6 +7,64 @@ objects = { /* Begin PBXBuildFile section */ + 61591FDB2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDA2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework */; }; + 61591FDC2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDA2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 61591FDF2FF3D71E00BEFE92 /* ExpoFont.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDD2FF3D71E00BEFE92 /* ExpoFont.xcframework */; }; + 61591FE02FF3D71E00BEFE92 /* ExpoFont.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDD2FF3D71E00BEFE92 /* ExpoFont.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 61591FE12FF3D71E00BEFE92 /* ExpoFileSystem.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDE2FF3D71E00BEFE92 /* ExpoFileSystem.xcframework */; }; + 61591FE22FF3D71E00BEFE92 /* ExpoFileSystem.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDE2FF3D71E00BEFE92 /* ExpoFileSystem.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 61591FE42FF3DC2100BEFE92 /* ExpoModulesCore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE32FF3DC2100BEFE92 /* ExpoModulesCore.xcframework */; }; + 61591FE52FF3DC2100BEFE92 /* ExpoModulesCore.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE32FF3DC2100BEFE92 /* ExpoModulesCore.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 61591FE72FF3DD6700BEFE92 /* ExpoImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE62FF3DD6700BEFE92 /* ExpoImage.xcframework */; }; + 61591FE82FF3DD6700BEFE92 /* ExpoImage.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE62FF3DD6700BEFE92 /* ExpoImage.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 61591FEA2FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE92FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework */; }; + 61591FEB2FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE92FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 61591FF02FF3E3E200BEFE92 /* SDWebImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FEF2FF3E3E200BEFE92 /* SDWebImage.xcframework */; }; + 61591FF12FF3E3E300BEFE92 /* SDWebImage.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FEF2FF3E3E200BEFE92 /* SDWebImage.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 61591FF52FF3E41C00BEFE92 /* SDWebImageSVGCoder.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FF22FF3E41C00BEFE92 /* SDWebImageSVGCoder.xcframework */; }; + 61591FF62FF3E41C00BEFE92 /* SDWebImageSVGCoder.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FF22FF3E41C00BEFE92 /* SDWebImageSVGCoder.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 61591FF72FF3E41C00BEFE92 /* SDWebImageWebPCoder.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FF32FF3E41C00BEFE92 /* SDWebImageWebPCoder.xcframework */; }; + 61591FF82FF3E41C00BEFE92 /* SDWebImageWebPCoder.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FF32FF3E41C00BEFE92 /* SDWebImageWebPCoder.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 61591FF92FF3E41C00BEFE92 /* SDWebImageAVIFCoder.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FF42FF3E41C00BEFE92 /* SDWebImageAVIFCoder.xcframework */; }; + 61591FFA2FF3E41C00BEFE92 /* SDWebImageAVIFCoder.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FF42FF3E41C00BEFE92 /* SDWebImageAVIFCoder.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 61591FFC2FF3E43500BEFE92 /* libavif.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FFB2FF3E43500BEFE92 /* libavif.xcframework */; }; + 61591FFD2FF3E43500BEFE92 /* libavif.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FFB2FF3E43500BEFE92 /* libavif.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DA02FF7C09F00A719EB /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; }; + 618F4DA12FF7C09F00A719EB /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DA22FF7C09F00A719EB /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; + 618F4DA32FF7C09F00A719EB /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DA42FF7C09F00A719EB /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; + 618F4DA52FF7C09F00A719EB /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DA62FF7C09F00A719EB /* ExpoFileSystem.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDE2FF3D71E00BEFE92 /* ExpoFileSystem.xcframework */; }; + 618F4DA72FF7C09F00A719EB /* ExpoFileSystem.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDE2FF3D71E00BEFE92 /* ExpoFileSystem.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DA82FF7C09F00A719EB /* ExpoFont.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDD2FF3D71E00BEFE92 /* ExpoFont.xcframework */; }; + 618F4DA92FF7C09F00A719EB /* ExpoFont.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDD2FF3D71E00BEFE92 /* ExpoFont.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DAA2FF7C09F00A719EB /* ExpoImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE62FF3DD6700BEFE92 /* ExpoImage.xcframework */; }; + 618F4DAB2FF7C09F00A719EB /* ExpoImage.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE62FF3DD6700BEFE92 /* ExpoImage.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DAC2FF7C09F00A719EB /* ExpoModulesCore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE32FF3DC2100BEFE92 /* ExpoModulesCore.xcframework */; }; + 618F4DAD2FF7C09F00A719EB /* ExpoModulesCore.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE32FF3DC2100BEFE92 /* ExpoModulesCore.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DAE2FF7C09F00A719EB /* ExpoModulesJSI.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDA2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework */; }; + 618F4DAF2FF7C09F00A719EB /* ExpoModulesJSI.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDA2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DB02FF7C09F00A719EB /* ExpoModulesWorklets.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE92FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework */; }; + 618F4DB12FF7C09F00A719EB /* ExpoModulesWorklets.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE92FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DB22FF7C09F00A719EB /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; }; + 618F4DB32FF7C09F00A719EB /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DB42FF7C09F00A719EB /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; }; + 618F4DB52FF7C09F00A719EB /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DB62FF7C09F00A719EB /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; }; + 618F4DB72FF7C09F00A719EB /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DB82FF7C09F00A719EB /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; + 618F4DB92FF7C09F00A719EB /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DC02FF7C09F00A719EB /* libavif.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBB2FF7C09F00A719EB /* libavif.xcframework */; }; + 618F4DC12FF7C09F00A719EB /* libavif.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBB2FF7C09F00A719EB /* libavif.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DC22FF7C09F00A719EB /* SDWebImageSVGCoder.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBC2FF7C09F00A719EB /* SDWebImageSVGCoder.xcframework */; }; + 618F4DC32FF7C09F00A719EB /* SDWebImageSVGCoder.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBC2FF7C09F00A719EB /* SDWebImageSVGCoder.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DC42FF7C09F00A719EB /* SDWebImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBD2FF7C09F00A719EB /* SDWebImage.xcframework */; }; + 618F4DC52FF7C09F00A719EB /* SDWebImage.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBD2FF7C09F00A719EB /* SDWebImage.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DC62FF7C09F00A719EB /* SDWebImageWebPCoder.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBE2FF7C09F00A719EB /* SDWebImageWebPCoder.xcframework */; }; + 618F4DC72FF7C09F00A719EB /* SDWebImageWebPCoder.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBE2FF7C09F00A719EB /* SDWebImageWebPCoder.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 618F4DC82FF7C09F00A719EB /* SDWebImageAVIFCoder.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBF2FF7C09F00A719EB /* SDWebImageAVIFCoder.xcframework */; }; + 618F4DC92FF7C09F00A719EB /* SDWebImageAVIFCoder.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBF2FF7C09F00A719EB /* SDWebImageAVIFCoder.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 795327712FB4A902008398F3 /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; }; 795327722FB4A902008398F3 /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 795327732FB4A904008398F3 /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; @@ -21,16 +79,6 @@ 7953277C2FB4A909008398F3 /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7953277D2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; 7953277E2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE6B2FB7270E00B94C6F /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; - 79B8BE6C2FB7270E00B94C6F /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; - 79B8BE6E2FB7270E00B94C6F /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; }; - 79B8BE6F2FB7270E00B94C6F /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; }; - 79B8BE702FB7270E00B94C6F /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; }; - 79B8BE742FB7270E00B94C6F /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE752FB7270E00B94C6F /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE772FB7270E00B94C6F /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE782FB7270E00B94C6F /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B8BE792FB7270E00B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 79B8BE862FB7273600B94C6F /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; 79B8BE872FB7273600B94C6F /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; 79B8BE882FB7273600B94C6F /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; @@ -45,6 +93,20 @@ 79B8BE932FB7273600B94C6F /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 79B8BE942FB7273600B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 79B8BE952FB7273600B94C6F /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BEA02FB8000000B94C6F /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; + 79B8BEA12FB8000000B94C6F /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; + 79B8BEA22FB8000000B94C6F /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; + 79B8BEA32FB8000000B94C6F /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; }; + 79B8BEA42FB8000000B94C6F /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; }; + 79B8BEA52FB8000000B94C6F /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; }; + 79B8BEA62FB8000000B94C6F /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; }; + 79B8BEA72FB8000000B94C6F /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BEA82FB8000000B94C6F /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BEA92FB8000000B94C6F /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BEAA2FB8000000B94C6F /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BEAB2FB8000000B94C6F /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BEAC2FB8000000B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BEAD2FB8000000B94C6F /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7A1B2C3D4E5F60718293A101 /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; 7A1B2C3D4E5F60718293A102 /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; 7A1B2C3D4E5F60718293A103 /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; @@ -59,37 +121,72 @@ 7A1B2C3D4E5F60718293A10C /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7A1B2C3D4E5F60718293A10D /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7A1B2C3D4E5F60718293A10E /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A110 /* ExpoFont.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDD2FF3D71E00BEFE92 /* ExpoFont.xcframework */; }; + 7A1B2C3D4E5F60718293A111 /* SDWebImageSVGCoder.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBC2FF7C09F00A719EB /* SDWebImageSVGCoder.xcframework */; }; + 7A1B2C3D4E5F60718293A112 /* SDWebImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBD2FF7C09F00A719EB /* SDWebImage.xcframework */; }; + 7A1B2C3D4E5F60718293A113 /* ExpoModulesCore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE32FF3DC2100BEFE92 /* ExpoModulesCore.xcframework */; }; + 7A1B2C3D4E5F60718293A114 /* SDWebImageAVIFCoder.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBF2FF7C09F00A719EB /* SDWebImageAVIFCoder.xcframework */; }; + 7A1B2C3D4E5F60718293A115 /* ExpoModulesWorklets.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE92FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework */; }; + 7A1B2C3D4E5F60718293A116 /* ExpoModulesJSI.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDA2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework */; }; + 7A1B2C3D4E5F60718293A117 /* libavif.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBB2FF7C09F00A719EB /* libavif.xcframework */; }; + 7A1B2C3D4E5F60718293A118 /* SDWebImageWebPCoder.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBE2FF7C09F00A719EB /* SDWebImageWebPCoder.xcframework */; }; + 7A1B2C3D4E5F60718293A119 /* ExpoImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE62FF3DD6700BEFE92 /* ExpoImage.xcframework */; }; + 7A1B2C3D4E5F60718293A11A /* ExpoFileSystem.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDE2FF3D71E00BEFE92 /* ExpoFileSystem.xcframework */; }; + 7A1B2C3D4E5F60718293A120 /* ExpoFont.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDD2FF3D71E00BEFE92 /* ExpoFont.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A121 /* SDWebImageSVGCoder.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBC2FF7C09F00A719EB /* SDWebImageSVGCoder.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A122 /* SDWebImage.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBD2FF7C09F00A719EB /* SDWebImage.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A123 /* ExpoModulesCore.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE32FF3DC2100BEFE92 /* ExpoModulesCore.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A124 /* SDWebImageAVIFCoder.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBF2FF7C09F00A719EB /* SDWebImageAVIFCoder.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A125 /* ExpoModulesWorklets.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE92FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A126 /* ExpoModulesJSI.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDA2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A127 /* libavif.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBB2FF7C09F00A719EB /* libavif.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A128 /* SDWebImageWebPCoder.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 618F4DBE2FF7C09F00A719EB /* SDWebImageWebPCoder.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A129 /* ExpoImage.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FE62FF3DD6700BEFE92 /* ExpoImage.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A1B2C3D4E5F60718293A12A /* ExpoFileSystem.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 61591FDE2FF3D71E00BEFE92 /* ExpoFileSystem.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ - 79688AB82FB3EA8400D728BD /* Embed Frameworks */ = { + 618F4DBA2FF7C09F00A719EB /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 795327762FB4A905008398F3 /* Brownie.xcframework in Embed Frameworks */, - 7953277C2FB4A909008398F3 /* ReactBrownfield.xcframework in Embed Frameworks */, - 7953277E2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Embed Frameworks */, - 795327742FB4A904008398F3 /* BrownfieldNavigation.xcframework in Embed Frameworks */, - 795327782FB4A906008398F3 /* hermesvm.xcframework in Embed Frameworks */, - 795327722FB4A902008398F3 /* BrownfieldLib.xcframework in Embed Frameworks */, - 7953277A2FB4A908008398F3 /* React.xcframework in Embed Frameworks */, + 618F4DA52FF7C09F00A719EB /* Brownie.xcframework in Embed Frameworks */, + 618F4DB72FF7C09F00A719EB /* ReactBrownfield.xcframework in Embed Frameworks */, + 618F4DA32FF7C09F00A719EB /* BrownfieldNavigation.xcframework in Embed Frameworks */, + 618F4DA92FF7C09F00A719EB /* ExpoFont.xcframework in Embed Frameworks */, + 618F4DC32FF7C09F00A719EB /* SDWebImageSVGCoder.xcframework in Embed Frameworks */, + 618F4DC52FF7C09F00A719EB /* SDWebImage.xcframework in Embed Frameworks */, + 618F4DAD2FF7C09F00A719EB /* ExpoModulesCore.xcframework in Embed Frameworks */, + 618F4DC92FF7C09F00A719EB /* SDWebImageAVIFCoder.xcframework in Embed Frameworks */, + 618F4DB32FF7C09F00A719EB /* hermesvm.xcframework in Embed Frameworks */, + 618F4DB12FF7C09F00A719EB /* ExpoModulesWorklets.xcframework in Embed Frameworks */, + 618F4DAF2FF7C09F00A719EB /* ExpoModulesJSI.xcframework in Embed Frameworks */, + 618F4DB52FF7C09F00A719EB /* React.xcframework in Embed Frameworks */, + 618F4DC12FF7C09F00A719EB /* libavif.xcframework in Embed Frameworks */, + 618F4DB92FF7C09F00A719EB /* ReactNativeDependencies.xcframework in Embed Frameworks */, + 618F4DC72FF7C09F00A719EB /* SDWebImageWebPCoder.xcframework in Embed Frameworks */, + 618F4DAB2FF7C09F00A719EB /* ExpoImage.xcframework in Embed Frameworks */, + 618F4DA72FF7C09F00A719EB /* ExpoFileSystem.xcframework in Embed Frameworks */, + 618F4DA12FF7C09F00A719EB /* BrownfieldLib.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 79B8BE732FB7270E00B94C6F /* Embed Frameworks */ = { + 79688AB82FB3EA8400D728BD /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 79B8BE742FB7270E00B94C6F /* Brownie.xcframework in Embed Frameworks */, - 79B8BE752FB7270E00B94C6F /* ReactBrownfield.xcframework in Embed Frameworks */, - 79B8BE772FB7270E00B94C6F /* BrownfieldNavigation.xcframework in Embed Frameworks */, - 79B8BE782FB7270E00B94C6F /* hermesvm.xcframework in Embed Frameworks */, - 79B8BE792FB7270E00B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */, + 795327762FB4A905008398F3 /* Brownie.xcframework in Embed Frameworks */, + 7953277C2FB4A909008398F3 /* ReactBrownfield.xcframework in Embed Frameworks */, + 7953277E2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Embed Frameworks */, + 795327742FB4A904008398F3 /* BrownfieldNavigation.xcframework in Embed Frameworks */, + 795327782FB4A906008398F3 /* hermesvm.xcframework in Embed Frameworks */, + 795327722FB4A902008398F3 /* BrownfieldLib.xcframework in Embed Frameworks */, + 7953277A2FB4A908008398F3 /* React.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -111,6 +208,34 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 79B8BEAE2FB8000000B94C6F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 61591FEB2FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework in Embed Frameworks */, + 79B8BEA72FB8000000B94C6F /* Brownie.xcframework in Embed Frameworks */, + 79B8BEA82FB8000000B94C6F /* ReactBrownfield.xcframework in Embed Frameworks */, + 61591FFA2FF3E41C00BEFE92 /* SDWebImageAVIFCoder.xcframework in Embed Frameworks */, + 79B8BEA92FB8000000B94C6F /* ReactNativeDependencies.xcframework in Embed Frameworks */, + 61591FF62FF3E41C00BEFE92 /* SDWebImageSVGCoder.xcframework in Embed Frameworks */, + 61591FE82FF3DD6700BEFE92 /* ExpoImage.xcframework in Embed Frameworks */, + 79B8BEAA2FB8000000B94C6F /* BrownfieldNavigation.xcframework in Embed Frameworks */, + 61591FE52FF3DC2100BEFE92 /* ExpoModulesCore.xcframework in Embed Frameworks */, + 61591FFD2FF3E43500BEFE92 /* libavif.xcframework in Embed Frameworks */, + 61591FDC2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework in Embed Frameworks */, + 61591FF82FF3E41C00BEFE92 /* SDWebImageWebPCoder.xcframework in Embed Frameworks */, + 79B8BEAB2FB8000000B94C6F /* hermesvm.xcframework in Embed Frameworks */, + 61591FE22FF3D71E00BEFE92 /* ExpoFileSystem.xcframework in Embed Frameworks */, + 79B8BEAC2FB8000000B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */, + 79B8BEAD2FB8000000B94C6F /* React.xcframework in Embed Frameworks */, + 61591FE02FF3D71E00BEFE92 /* ExpoFont.xcframework in Embed Frameworks */, + 61591FF12FF3E3E300BEFE92 /* SDWebImage.xcframework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 7A1B2C3D4E5F60718293A201 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -119,11 +244,22 @@ files = ( 7A1B2C3D4E5F60718293A108 /* Brownie.xcframework in Embed Frameworks */, 7A1B2C3D4E5F60718293A109 /* ReactBrownfield.xcframework in Embed Frameworks */, - 7A1B2C3D4E5F60718293A10A /* ReactNativeDependencies.xcframework in Embed Frameworks */, 7A1B2C3D4E5F60718293A10B /* BrownfieldNavigation.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A120 /* ExpoFont.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A121 /* SDWebImageSVGCoder.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A122 /* SDWebImage.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A123 /* ExpoModulesCore.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A124 /* SDWebImageAVIFCoder.xcframework in Embed Frameworks */, 7A1B2C3D4E5F60718293A10C /* hermesvm.xcframework in Embed Frameworks */, - 7A1B2C3D4E5F60718293A10D /* BrownfieldLib.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A125 /* ExpoModulesWorklets.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A126 /* ExpoModulesJSI.xcframework in Embed Frameworks */, 7A1B2C3D4E5F60718293A10E /* React.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A127 /* libavif.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A10A /* ReactNativeDependencies.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A128 /* SDWebImageWebPCoder.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A129 /* ExpoImage.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A12A /* ExpoFileSystem.xcframework in Embed Frameworks */, + 7A1B2C3D4E5F60718293A10D /* BrownfieldLib.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -131,6 +267,23 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 61591FDA2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ExpoModulesJSI.xcframework; path = package/ExpoModulesJSI.xcframework; sourceTree = ""; }; + 61591FDD2FF3D71E00BEFE92 /* ExpoFont.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ExpoFont.xcframework; path = package/ExpoFont.xcframework; sourceTree = ""; }; + 61591FDE2FF3D71E00BEFE92 /* ExpoFileSystem.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ExpoFileSystem.xcframework; path = package/ExpoFileSystem.xcframework; sourceTree = ""; }; + 61591FE32FF3DC2100BEFE92 /* ExpoModulesCore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ExpoModulesCore.xcframework; path = package/ExpoModulesCore.xcframework; sourceTree = ""; }; + 61591FE62FF3DD6700BEFE92 /* ExpoImage.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ExpoImage.xcframework; path = package/ExpoImage.xcframework; sourceTree = ""; }; + 61591FE92FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ExpoModulesWorklets.xcframework; path = package/ExpoModulesWorklets.xcframework; sourceTree = ""; }; + 61591FEF2FF3E3E200BEFE92 /* SDWebImage.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDWebImage.xcframework; path = "../ExpoApp56/node_modules/expo-image/prebuilds/spm-deps/SDWebImage/debug/SDWebImage.xcframework"; sourceTree = ""; }; + 61591FF22FF3E41C00BEFE92 /* SDWebImageSVGCoder.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDWebImageSVGCoder.xcframework; path = "../ExpoApp56/node_modules/expo-image/prebuilds/spm-deps/SDWebImageSVGCoder/debug/SDWebImageSVGCoder.xcframework"; sourceTree = ""; }; + 61591FF32FF3E41C00BEFE92 /* SDWebImageWebPCoder.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDWebImageWebPCoder.xcframework; path = "../ExpoApp56/node_modules/expo-image/prebuilds/spm-deps/SDWebImageWebPCoder/debug/SDWebImageWebPCoder.xcframework"; sourceTree = ""; }; + 61591FF42FF3E41C00BEFE92 /* SDWebImageAVIFCoder.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDWebImageAVIFCoder.xcframework; path = "../ExpoApp56/node_modules/expo-image/prebuilds/spm-deps/SDWebImageAVIFCoder/debug/SDWebImageAVIFCoder.xcframework"; sourceTree = ""; }; + 61591FFB2FF3E43500BEFE92 /* libavif.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libavif.xcframework; path = "../ExpoApp56/node_modules/expo-image/prebuilds/spm-deps/libavif/debug/libavif.xcframework"; sourceTree = ""; }; + 617FBE3E2FF7AA9D00348DD8 /* Brownfield Apple App (ExpoApp57).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoApp57).app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 618F4DBB2FF7C09F00A719EB /* libavif.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libavif.xcframework; path = "../ExpoApp57/node_modules/expo-image/prebuilds/spm-deps/libavif/release/libavif.xcframework"; sourceTree = ""; }; + 618F4DBC2FF7C09F00A719EB /* SDWebImageSVGCoder.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDWebImageSVGCoder.xcframework; path = "../ExpoApp57/node_modules/expo-image/prebuilds/spm-deps/SDWebImageSVGCoder/release/SDWebImageSVGCoder.xcframework"; sourceTree = ""; }; + 618F4DBD2FF7C09F00A719EB /* SDWebImage.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDWebImage.xcframework; path = "../ExpoApp57/node_modules/expo-image/prebuilds/spm-deps/SDWebImage/release/SDWebImage.xcframework"; sourceTree = ""; }; + 618F4DBE2FF7C09F00A719EB /* SDWebImageWebPCoder.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDWebImageWebPCoder.xcframework; path = "../ExpoApp57/node_modules/expo-image/prebuilds/spm-deps/SDWebImageWebPCoder/release/SDWebImageWebPCoder.xcframework"; sourceTree = ""; }; + 618F4DBF2FF7C09F00A719EB /* SDWebImageAVIFCoder.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SDWebImageAVIFCoder.xcframework; path = "../ExpoApp57/node_modules/expo-image/prebuilds/spm-deps/SDWebImageAVIFCoder/release/SDWebImageAVIFCoder.xcframework"; sourceTree = ""; }; 793C76A72EEBF938008A2A34 /* Brownfield Apple App (RNApp).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (RNApp).app"; sourceTree = BUILT_PRODUCTS_DIR; }; 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrownfieldLib.xcframework; path = package/BrownfieldLib.xcframework; sourceTree = ""; }; 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrownfieldNavigation.xcframework; path = package/BrownfieldNavigation.xcframework; sourceTree = ""; }; @@ -139,9 +292,9 @@ 79B1D99D2FB4A61400A5F42B /* React.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = React.xcframework; path = package/React.xcframework; sourceTree = ""; }; 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ReactBrownfield.xcframework; path = package/ReactBrownfield.xcframework; sourceTree = ""; }; 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ReactNativeDependencies.xcframework; path = package/ReactNativeDependencies.xcframework; sourceTree = ""; }; - 79B8BE802FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoApp54).app"; sourceTree = BUILT_PRODUCTS_DIR; }; 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoApp55).app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 7A1B2C3D4E5F60718293A202 /* Brownfield Apple App (ExpoAppBeta).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoAppBeta).app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 79B8BEB22FB8000000B94C6F /* Brownfield Apple App (ExpoApp56).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoApp56).app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7A1B2C3D4E5F60718293A202 /* Brownfield Apple App (ExpoAppPreview).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoAppPreview).app"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ @@ -153,6 +306,31 @@ /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ + 617FBE122FF7AA9D00348DD8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 618F4DA42FF7C09F00A719EB /* Brownie.xcframework in Frameworks */, + 618F4DB62FF7C09F00A719EB /* ReactBrownfield.xcframework in Frameworks */, + 618F4DA22FF7C09F00A719EB /* BrownfieldNavigation.xcframework in Frameworks */, + 618F4DA82FF7C09F00A719EB /* ExpoFont.xcframework in Frameworks */, + 618F4DC22FF7C09F00A719EB /* SDWebImageSVGCoder.xcframework in Frameworks */, + 618F4DC42FF7C09F00A719EB /* SDWebImage.xcframework in Frameworks */, + 618F4DAC2FF7C09F00A719EB /* ExpoModulesCore.xcframework in Frameworks */, + 618F4DC82FF7C09F00A719EB /* SDWebImageAVIFCoder.xcframework in Frameworks */, + 618F4DB22FF7C09F00A719EB /* hermesvm.xcframework in Frameworks */, + 618F4DB02FF7C09F00A719EB /* ExpoModulesWorklets.xcframework in Frameworks */, + 618F4DAE2FF7C09F00A719EB /* ExpoModulesJSI.xcframework in Frameworks */, + 618F4DB42FF7C09F00A719EB /* React.xcframework in Frameworks */, + 618F4DC02FF7C09F00A719EB /* libavif.xcframework in Frameworks */, + 618F4DB82FF7C09F00A719EB /* ReactNativeDependencies.xcframework in Frameworks */, + 618F4DC62FF7C09F00A719EB /* SDWebImageWebPCoder.xcframework in Frameworks */, + 618F4DAA2FF7C09F00A719EB /* ExpoImage.xcframework in Frameworks */, + 618F4DA62FF7C09F00A719EB /* ExpoFileSystem.xcframework in Frameworks */, + 618F4DA02FF7C09F00A719EB /* BrownfieldLib.xcframework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 793C76A42EEBF938008A2A34 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -167,18 +345,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 79B8BE6A2FB7270E00B94C6F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 79B8BE6B2FB7270E00B94C6F /* Brownie.xcframework in Frameworks */, - 79B8BE6C2FB7270E00B94C6F /* BrownfieldNavigation.xcframework in Frameworks */, - 79B8BE6E2FB7270E00B94C6F /* hermesvm.xcframework in Frameworks */, - 79B8BE6F2FB7270E00B94C6F /* ReactBrownfield.xcframework in Frameworks */, - 79B8BE702FB7270E00B94C6F /* BrownfieldLib.xcframework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 79B8BE852FB7273600B94C6F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -193,17 +359,53 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 79B8BEAF2FB8000000B94C6F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 61591FEA2FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework in Frameworks */, + 79B8BEA02FB8000000B94C6F /* Brownie.xcframework in Frameworks */, + 79B8BEA12FB8000000B94C6F /* BrownfieldNavigation.xcframework in Frameworks */, + 61591FF92FF3E41C00BEFE92 /* SDWebImageAVIFCoder.xcframework in Frameworks */, + 79B8BEA22FB8000000B94C6F /* ReactNativeDependencies.xcframework in Frameworks */, + 61591FF52FF3E41C00BEFE92 /* SDWebImageSVGCoder.xcframework in Frameworks */, + 61591FE72FF3DD6700BEFE92 /* ExpoImage.xcframework in Frameworks */, + 79B8BEA32FB8000000B94C6F /* hermesvm.xcframework in Frameworks */, + 61591FE42FF3DC2100BEFE92 /* ExpoModulesCore.xcframework in Frameworks */, + 61591FFC2FF3E43500BEFE92 /* libavif.xcframework in Frameworks */, + 61591FDB2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework in Frameworks */, + 61591FF72FF3E41C00BEFE92 /* SDWebImageWebPCoder.xcframework in Frameworks */, + 79B8BEA42FB8000000B94C6F /* ReactBrownfield.xcframework in Frameworks */, + 61591FE12FF3D71E00BEFE92 /* ExpoFileSystem.xcframework in Frameworks */, + 79B8BEA52FB8000000B94C6F /* BrownfieldLib.xcframework in Frameworks */, + 79B8BEA62FB8000000B94C6F /* React.xcframework in Frameworks */, + 61591FDF2FF3D71E00BEFE92 /* ExpoFont.xcframework in Frameworks */, + 61591FF02FF3E3E200BEFE92 /* SDWebImage.xcframework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 7A1B2C3D4E5F60718293A204 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 7A1B2C3D4E5F60718293A101 /* Brownie.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A105 /* ReactBrownfield.xcframework in Frameworks */, 7A1B2C3D4E5F60718293A102 /* BrownfieldNavigation.xcframework in Frameworks */, - 7A1B2C3D4E5F60718293A103 /* ReactNativeDependencies.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A110 /* ExpoFont.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A111 /* SDWebImageSVGCoder.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A112 /* SDWebImage.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A113 /* ExpoModulesCore.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A114 /* SDWebImageAVIFCoder.xcframework in Frameworks */, 7A1B2C3D4E5F60718293A104 /* hermesvm.xcframework in Frameworks */, - 7A1B2C3D4E5F60718293A105 /* ReactBrownfield.xcframework in Frameworks */, - 7A1B2C3D4E5F60718293A106 /* BrownfieldLib.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A115 /* ExpoModulesWorklets.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A116 /* ExpoModulesJSI.xcframework in Frameworks */, 7A1B2C3D4E5F60718293A107 /* React.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A117 /* libavif.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A103 /* ReactNativeDependencies.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A118 /* SDWebImageWebPCoder.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A119 /* ExpoImage.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A11A /* ExpoFileSystem.xcframework in Frameworks */, + 7A1B2C3D4E5F60718293A106 /* BrownfieldLib.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -213,6 +415,22 @@ 6108E5322F40A26800EA8FA1 /* Frameworks */ = { isa = PBXGroup; children = ( + 61591FFB2FF3E43500BEFE92 /* libavif.xcframework */, + 61591FF42FF3E41C00BEFE92 /* SDWebImageAVIFCoder.xcframework */, + 618F4DBD2FF7C09F00A719EB /* SDWebImage.xcframework */, + 618F4DBF2FF7C09F00A719EB /* SDWebImageAVIFCoder.xcframework */, + 61591FF22FF3E41C00BEFE92 /* SDWebImageSVGCoder.xcframework */, + 61591FF32FF3E41C00BEFE92 /* SDWebImageWebPCoder.xcframework */, + 61591FEF2FF3E3E200BEFE92 /* SDWebImage.xcframework */, + 618F4DBB2FF7C09F00A719EB /* libavif.xcframework */, + 618F4DBC2FF7C09F00A719EB /* SDWebImageSVGCoder.xcframework */, + 618F4DBE2FF7C09F00A719EB /* SDWebImageWebPCoder.xcframework */, + 61591FE92FF3DEA600BEFE92 /* ExpoModulesWorklets.xcframework */, + 61591FE62FF3DD6700BEFE92 /* ExpoImage.xcframework */, + 61591FE32FF3DC2100BEFE92 /* ExpoModulesCore.xcframework */, + 61591FDE2FF3D71E00BEFE92 /* ExpoFileSystem.xcframework */, + 61591FDD2FF3D71E00BEFE92 /* ExpoFont.xcframework */, + 61591FDA2FF399EC00BEFE92 /* ExpoModulesJSI.xcframework */, 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */, 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */, 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */, @@ -237,9 +455,10 @@ isa = PBXGroup; children = ( 793C76A72EEBF938008A2A34 /* Brownfield Apple App (RNApp).app */, - 79B8BE802FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54).app */, 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */, - 7A1B2C3D4E5F60718293A202 /* Brownfield Apple App (ExpoAppBeta).app */, + 79B8BEB22FB8000000B94C6F /* Brownfield Apple App (ExpoApp56).app */, + 7A1B2C3D4E5F60718293A202 /* Brownfield Apple App (ExpoAppPreview).app */, + 617FBE3E2FF7AA9D00348DD8 /* Brownfield Apple App (ExpoApp57).app */, ); name = Products; sourceTree = ""; @@ -247,14 +466,14 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 793C76A62EEBF938008A2A34 /* Brownfield Apple App (RNApp) */ = { + 617FBE102FF7AA9D00348DD8 /* Brownfield Apple App (ExpoApp57) */ = { isa = PBXNativeTarget; - buildConfigurationList = 793C76B22EEBF939008A2A34 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (RNApp)" */; + buildConfigurationList = 617FBE392FF7AA9D00348DD8 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp57)" */; buildPhases = ( - 793C76A32EEBF938008A2A34 /* Sources */, - 793C76A42EEBF938008A2A34 /* Frameworks */, - 793C76A52EEBF938008A2A34 /* Resources */, - 79688AB82FB3EA8400D728BD /* Embed Frameworks */, + 617FBE112FF7AA9D00348DD8 /* Sources */, + 617FBE122FF7AA9D00348DD8 /* Frameworks */, + 617FBE252FF7AA9D00348DD8 /* Resources */, + 618F4DBA2FF7C09F00A719EB /* Embed Frameworks */, ); buildRules = ( ); @@ -263,21 +482,21 @@ fileSystemSynchronizedGroups = ( 793C76A92EEBF938008A2A34 /* Brownfield Apple App */, ); - name = "Brownfield Apple App (RNApp)"; + name = "Brownfield Apple App (ExpoApp57)"; packageProductDependencies = ( ); productName = "Brownfield Apple App"; - productReference = 793C76A72EEBF938008A2A34 /* Brownfield Apple App (RNApp).app */; + productReference = 617FBE3E2FF7AA9D00348DD8 /* Brownfield Apple App (ExpoApp57).app */; productType = "com.apple.product-type.application"; }; - 79B8BE682FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54) */ = { + 793C76A62EEBF938008A2A34 /* Brownfield Apple App (RNApp) */ = { isa = PBXNativeTarget; - buildConfigurationList = 79B8BE7B2FB7270E00B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp54)" */; + buildConfigurationList = 793C76B22EEBF939008A2A34 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (RNApp)" */; buildPhases = ( - 79B8BE692FB7270E00B94C6F /* Sources */, - 79B8BE6A2FB7270E00B94C6F /* Frameworks */, - 79B8BE722FB7270E00B94C6F /* Resources */, - 79B8BE732FB7270E00B94C6F /* Embed Frameworks */, + 793C76A32EEBF938008A2A34 /* Sources */, + 793C76A42EEBF938008A2A34 /* Frameworks */, + 793C76A52EEBF938008A2A34 /* Resources */, + 79688AB82FB3EA8400D728BD /* Embed Frameworks */, ); buildRules = ( ); @@ -286,11 +505,11 @@ fileSystemSynchronizedGroups = ( 793C76A92EEBF938008A2A34 /* Brownfield Apple App */, ); - name = "Brownfield Apple App (ExpoApp54)"; + name = "Brownfield Apple App (RNApp)"; packageProductDependencies = ( ); productName = "Brownfield Apple App"; - productReference = 79B8BE802FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54).app */; + productReference = 793C76A72EEBF938008A2A34 /* Brownfield Apple App (RNApp).app */; productType = "com.apple.product-type.application"; }; 79B8BE832FB7273600B94C6F /* Brownfield Apple App (ExpoApp55) */ = { @@ -316,9 +535,32 @@ productReference = 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */; productType = "com.apple.product-type.application"; }; - 7A1B2C3D4E5F60718293A301 /* Brownfield Apple App (ExpoAppBeta) */ = { + 79B8BEB42FB8000000B94C6F /* Brownfield Apple App (ExpoApp56) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 79B8BEB92FB8000000B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp56)" */; + buildPhases = ( + 79B8BEB12FB8000000B94C6F /* Sources */, + 79B8BEAF2FB8000000B94C6F /* Frameworks */, + 79B8BEB02FB8000000B94C6F /* Resources */, + 79B8BEAE2FB8000000B94C6F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 793C76A92EEBF938008A2A34 /* Brownfield Apple App */, + ); + name = "Brownfield Apple App (ExpoApp56)"; + packageProductDependencies = ( + ); + productName = "Brownfield Apple App"; + productReference = 79B8BEB22FB8000000B94C6F /* Brownfield Apple App (ExpoApp56).app */; + productType = "com.apple.product-type.application"; + }; + 7A1B2C3D4E5F60718293A301 /* Brownfield Apple App (ExpoAppPreview) */ = { isa = PBXNativeTarget; - buildConfigurationList = 7A1B2C3D4E5F60718293A405 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoAppBeta)" */; + buildConfigurationList = 7A1B2C3D4E5F60718293A405 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoAppPreview)" */; buildPhases = ( 7A1B2C3D4E5F60718293A302 /* Sources */, 7A1B2C3D4E5F60718293A204 /* Frameworks */, @@ -332,11 +574,11 @@ fileSystemSynchronizedGroups = ( 793C76A92EEBF938008A2A34 /* Brownfield Apple App */, ); - name = "Brownfield Apple App (ExpoAppBeta)"; + name = "Brownfield Apple App (ExpoAppPreview)"; packageProductDependencies = ( ); productName = "Brownfield Apple App"; - productReference = 7A1B2C3D4E5F60718293A202 /* Brownfield Apple App (ExpoAppBeta).app */; + productReference = 7A1B2C3D4E5F60718293A202 /* Brownfield Apple App (ExpoAppPreview).app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -352,6 +594,12 @@ 793C76A62EEBF938008A2A34 = { CreatedOnToolsVersion = 26.1.1; }; + 79B8BEB42FB8000000B94C6F = { + CreatedOnToolsVersion = 26.1.1; + }; + 7A1B2C3D4E5F60718293A301 = { + CreatedOnToolsVersion = 26.1.1; + }; }; }; buildConfigurationList = 793C76A22EEBF938008A2A34 /* Build configuration list for PBXProject "Brownfield Apple App" */; @@ -363,29 +611,31 @@ ); mainGroup = 793C769E2EEBF938008A2A34; minimizedProjectReferenceProxies = 1; + packageReferences = ( + ); preferredProjectObjectVersion = 77; productRefGroup = 793C76A82EEBF938008A2A34 /* Products */; projectDirPath = ""; projectRoot = ""; - targets = ( - 793C76A62EEBF938008A2A34 /* Brownfield Apple App (RNApp) */, - 79B8BE682FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54) */, - 79B8BE832FB7273600B94C6F /* Brownfield Apple App (ExpoApp55) */, - 7A1B2C3D4E5F60718293A301 /* Brownfield Apple App (ExpoAppBeta) */, - ); - + targets = ( + 793C76A62EEBF938008A2A34 /* Brownfield Apple App (RNApp) */, + 79B8BE832FB7273600B94C6F /* Brownfield Apple App (ExpoApp55) */, + 79B8BEB42FB8000000B94C6F /* Brownfield Apple App (ExpoApp56) */, + 617FBE102FF7AA9D00348DD8 /* Brownfield Apple App (ExpoApp57) */, + 7A1B2C3D4E5F60718293A301 /* Brownfield Apple App (ExpoAppPreview) */, + ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 793C76A52EEBF938008A2A34 /* Resources */ = { + 617FBE252FF7AA9D00348DD8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 79B8BE722FB7270E00B94C6F /* Resources */ = { + 793C76A52EEBF938008A2A34 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -399,6 +649,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 79B8BEB02FB8000000B94C6F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 7A1B2C3D4E5F60718293A303 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -409,14 +666,14 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 793C76A32EEBF938008A2A34 /* Sources */ = { + 617FBE112FF7AA9D00348DD8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 79B8BE692FB7270E00B94C6F /* Sources */ = { + 793C76A32EEBF938008A2A34 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -430,6 +687,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 79B8BEB12FB8000000B94C6F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 7A1B2C3D4E5F60718293A302 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -440,6 +704,194 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + 617FBE3A2FF7AA9D00348DD8 /* Debug Expo */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) USE_EXPO_HOST"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = NO; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Debug Expo"; + }; + 617FBE3B2FF7AA9D00348DD8 /* Release Expo */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) USE_EXPO_HOST"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = NO; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Release Expo"; + }; + 617FBE3C2FF7AA9D00348DD8 /* Debug Vanilla */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = YES; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Debug Vanilla"; + }; + 617FBE3D2FF7AA9D00348DD8 /* Release Vanilla */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = YES; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Release Vanilla"; + }; 793C76B02EEBF939008A2A34 /* Debug Expo */ = { isa = XCBuildConfiguration; buildSettings = { @@ -652,7 +1104,7 @@ }; name = "Release Expo"; }; - 79B8BE7C2FB7270E00B94C6F /* Debug Expo */ = { + 79B8BE972FB7273600B94C6F /* Debug Expo */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -699,7 +1151,7 @@ }; name = "Debug Expo"; }; - 79B8BE7D2FB7270E00B94C6F /* Release Expo */ = { + 79B8BE982FB7273600B94C6F /* Release Expo */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -746,7 +1198,7 @@ }; name = "Release Expo"; }; - 79B8BE7E2FB7270E00B94C6F /* Debug Vanilla */ = { + 79B8BE992FB7273600B94C6F /* Debug Vanilla */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -793,7 +1245,7 @@ }; name = "Debug Vanilla"; }; - 79B8BE7F2FB7270E00B94C6F /* Release Vanilla */ = { + 79B8BE9A2FB7273600B94C6F /* Release Vanilla */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -840,7 +1292,7 @@ }; name = "Release Vanilla"; }; - 79B8BE972FB7273600B94C6F /* Debug Expo */ = { + 79B8BEB52FB8000000B94C6F /* Debug Expo */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -864,7 +1316,7 @@ 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; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 14.0; @@ -887,7 +1339,7 @@ }; name = "Debug Expo"; }; - 79B8BE982FB7273600B94C6F /* Release Expo */ = { + 79B8BEB62FB8000000B94C6F /* Release Expo */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -911,7 +1363,7 @@ 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; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 14.0; @@ -934,7 +1386,7 @@ }; name = "Release Expo"; }; - 79B8BE992FB7273600B94C6F /* Debug Vanilla */ = { + 79B8BEB72FB8000000B94C6F /* Debug Vanilla */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -958,7 +1410,7 @@ 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; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 14.0; @@ -981,7 +1433,7 @@ }; name = "Debug Vanilla"; }; - 79B8BE9A2FB7273600B94C6F /* Release Vanilla */ = { + 79B8BEB82FB8000000B94C6F /* Release Vanilla */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -1005,7 +1457,7 @@ 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; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 14.0; @@ -1431,6 +1883,17 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 617FBE392FF7AA9D00348DD8 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp57)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 617FBE3A2FF7AA9D00348DD8 /* Debug Expo */, + 617FBE3B2FF7AA9D00348DD8 /* Release Expo */, + 617FBE3C2FF7AA9D00348DD8 /* Debug Vanilla */, + 617FBE3D2FF7AA9D00348DD8 /* Release Vanilla */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = "Release Expo"; + }; 793C76A22EEBF938008A2A34 /* Build configuration list for PBXProject "Brownfield Apple App" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1453,29 +1916,29 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = "Release Expo"; }; - 79B8BE7B2FB7270E00B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp54)" */ = { + 79B8BE962FB7273600B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp55)" */ = { isa = XCConfigurationList; buildConfigurations = ( - 79B8BE7C2FB7270E00B94C6F /* Debug Expo */, - 79B8BE7D2FB7270E00B94C6F /* Release Expo */, - 79B8BE7E2FB7270E00B94C6F /* Debug Vanilla */, - 79B8BE7F2FB7270E00B94C6F /* Release Vanilla */, + 79B8BE972FB7273600B94C6F /* Debug Expo */, + 79B8BE982FB7273600B94C6F /* Release Expo */, + 79B8BE992FB7273600B94C6F /* Debug Vanilla */, + 79B8BE9A2FB7273600B94C6F /* Release Vanilla */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = "Release Expo"; }; - 79B8BE962FB7273600B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp55)" */ = { + 79B8BEB92FB8000000B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp56)" */ = { isa = XCConfigurationList; buildConfigurations = ( - 79B8BE972FB7273600B94C6F /* Debug Expo */, - 79B8BE982FB7273600B94C6F /* Release Expo */, - 79B8BE992FB7273600B94C6F /* Debug Vanilla */, - 79B8BE9A2FB7273600B94C6F /* Release Vanilla */, + 79B8BEB52FB8000000B94C6F /* Debug Expo */, + 79B8BEB62FB8000000B94C6F /* Release Expo */, + 79B8BEB72FB8000000B94C6F /* Debug Vanilla */, + 79B8BEB82FB8000000B94C6F /* Release Vanilla */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = "Release Expo"; }; - 7A1B2C3D4E5F60718293A405 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoAppBeta)" */ = { + 7A1B2C3D4E5F60718293A405 /* 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 Expo 54.xcscheme b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 56.xcscheme similarity index 90% rename from apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 54.xcscheme rename to apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 56.xcscheme index 1e7d933a..0db5f92f 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 54.xcscheme +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 56.xcscheme @@ -28,9 +28,9 @@ runnableDebuggingMode = "0"> diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 57.xcscheme b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 57.xcscheme new file mode 100644 index 00000000..6f29d1a1 --- /dev/null +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 57.xcscheme @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo Beta.xcscheme b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo Preview.xcscheme similarity index 92% rename from apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo Beta.xcscheme rename to apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo Preview.xcscheme index 6ffc555f..0c2ef9fa 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo Beta.xcscheme +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo Preview.xcscheme @@ -29,8 +29,8 @@ 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 87fb27c8..a2ffa45e 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist @@ -4,15 +4,15 @@ SchemeUserState - Brownfield Apple App Expo 54.xcscheme + Brownfield Apple App Expo 55.xcscheme orderHint - 2 + 1 - Brownfield Apple App Expo 55.xcscheme + Brownfield Apple App Expo 56.xcscheme orderHint - 1 + 0 Brownfield Apple App Vanilla.xcscheme @@ -37,6 +37,11 @@ primary + 79B8BEB42FB8000000B94C6F + + primary + + diff --git a/apps/AppleApp/Brownfield Apple App/BrownfieldAppleApp.swift b/apps/AppleApp/Brownfield Apple App/BrownfieldAppleApp.swift index 0e131026..6c60a6a9 100644 --- a/apps/AppleApp/Brownfield Apple App/BrownfieldAppleApp.swift +++ b/apps/AppleApp/Brownfield Apple App/BrownfieldAppleApp.swift @@ -44,6 +44,50 @@ public class RNNavigationDelegate: BrownfieldNavigationDelegate { present(ReferralsScreen(userId: userId)) } + public func requestNativeConfirmation( + _ title: String, + resolve: @escaping (Any?) -> Void, + reject: @escaping (String?, String?, (any Error)?) -> Void + ) { + DispatchQueue.main.async { + guard let topController = UIApplication.shared.topMostViewController() else { + reject( + "no_view_controller", + "Could not find a view controller to present the confirmation.", + nil + ) + return + } + + let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "OK", style: .default) { _ in + resolve(true) + }) + alert.addAction(UIAlertAction(title: "Cancel", style: .cancel) { _ in + resolve(false) + }) + topController.present(alert, animated: true) + } + } + + public func showNativeBanner( + _ message: String, + onDismiss onDismiss: @escaping ([Any]?) -> Void + ) { + DispatchQueue.main.async { + guard let topController = UIApplication.shared.topMostViewController() else { + onDismiss([]) + return + } + + let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "Dismiss", style: .default) { _ in + onDismiss([]) + }) + topController.present(alert, animated: true) + } + } + private func present(_ view: Content) { DispatchQueue.main.async { let hostingController = UIHostingController(rootView: view) diff --git a/apps/AppleApp/Brownfield Apple App/components/ContentView.swift b/apps/AppleApp/Brownfield Apple App/components/ContentView.swift index 035111ae..a8a7167b 100644 --- a/apps/AppleApp/Brownfield Apple App/components/ContentView.swift +++ b/apps/AppleApp/Brownfield Apple App/components/ContentView.swift @@ -91,7 +91,3 @@ struct ContentView: View { } } } - -#Preview { - ContentView() -} diff --git a/apps/AppleApp/e2e/jest.config.expo56.cjs b/apps/AppleApp/e2e/jest.config.expo56.cjs new file mode 100644 index 00000000..4823f092 --- /dev/null +++ b/apps/AppleApp/e2e/jest.config.expo56.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('expo56'); + +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 4f732cb0..c45e96f8 100644 --- a/apps/AppleApp/package.json +++ b/apps/AppleApp/package.json @@ -4,18 +4,22 @@ "private": true, "type": "module", "scripts": { - "build:example:ios-consumer:expo": "yarn build:example:ios-consumer:expo55", - "build:example:ios-consumer:expo54": "node prepareXCFrameworks.js --appName ExpoApp54 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 54\" -configuration Release", + "build:example:ios-consumer:expo": "yarn build:example:ios-consumer:expo57", + "build:example:ios-consumer:expo57": "node prepareXCFrameworks.js --appName ExpoApp57 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 57\" -configuration Release", + "build:example:ios-consumer:expo56": "node prepareXCFrameworks.js --appName ExpoApp56 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 56\" -configuration Release", "build:example:ios-consumer:expo55": "node prepareXCFrameworks.js --appName ExpoApp55 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 55\" -configuration Release", - "build:example:ios-consumer:expobeta": "node prepareXCFrameworks.js --appName ExpoAppBeta && yarn internal::build::common -scheme \"Brownfield Apple App Expo Beta\" -configuration Release", + "build:example:ios-consumer: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\"", "internal::build::common": "xcodebuild -project \"Brownfield Apple App.xcodeproj\" -sdk iphonesimulator build CODE_SIGNING_ALLOWED=NO -derivedDataPath ./build", "e2e:build:ios": "detox build --configuration ios.sim.debug", "e2e:test:ios": "detox test --configuration ios.sim.debug", "e2e:build:ios:expo55": "detox build --config-path .detoxrc.expo55.cjs --configuration ios.sim.debug.expo55", "e2e:test:ios:expo55": "detox test --config-path .detoxrc.expo55.cjs --configuration ios.sim.debug.expo55", + "e2e:build:ios:expo56": "detox build --config-path .detoxrc.expo56.cjs --configuration ios.sim.debug.expo56", + "e2e:test:ios:expo56": "detox test --config-path .detoxrc.expo56.cjs --configuration ios.sim.debug.expo56", "ci:local:e2e:ios": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh", - "ci:local:e2e:ios:expo55": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh --variant expo55" + "ci:local:e2e:ios:expo55": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh --variant expo55", + "ci:local:e2e:ios:expo56": "bash ../../scripts/ci-local-appleapp-ios-e2e.sh --variant expo56" }, "devDependencies": { "@callstack/brownfield-example-shared-tests": "workspace:^", diff --git a/apps/AppleApp/prepareXCFrameworks.js b/apps/AppleApp/prepareXCFrameworks.js index c7a0efd1..bb65bc06 100644 --- a/apps/AppleApp/prepareXCFrameworks.js +++ b/apps/AppleApp/prepareXCFrameworks.js @@ -1,6 +1,5 @@ import path from 'node:path'; import fs from 'node:fs'; -import { execFileSync } from 'node:child_process'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; @@ -40,11 +39,6 @@ const sourcePackagePath = path.join( const targetPackagePath = path.join(__dirname, 'package'); -const prebuiltRnCoreArtifacts = [ - 'React.xcframework', - 'ReactNativeDependencies.xcframework', -]; - /** * The Xcode project is configured to link the following frameworks: * - BrownfieldLib (constant) @@ -59,17 +53,6 @@ const prebuiltRnCoreArtifacts = [ * */ -const validNames = [ - 'BrownfieldLib.xcframework', - 'Brownie.xcframework', - 'hermesvm.xcframework', - 'ReactBrownfield.xcframework', - 'BrownfieldNavigation.xcframework', - // below: optional, emitted when RN is packaged with prebuilt iOS pods - 'React.xcframework', - 'ReactNativeDependencies.xcframework', -]; - if (fs.existsSync(targetPackagePath)) { logger.info(`Removing ${targetPackagePath}\n`); fs.rmSync(targetPackagePath, { recursive: true, force: true }); @@ -86,15 +69,17 @@ const preferredArtifactSourcePath = fs.existsSync(spmArtifactsPath) : sourcePackagePath; for (const file of fs.readdirSync(preferredArtifactSourcePath)) { + const sourcePath = path.join(preferredArtifactSourcePath, file); + if ( - !validNames.includes(file) && - !['hermes.xcframework', 'hermesvm.xcframework'].includes(file) + !fs.statSync(sourcePath).isDirectory() || + !file.endsWith('.xcframework') ) { continue; } fs.cpSync( - path.join(preferredArtifactSourcePath, file), + sourcePath, path.join(targetPackagePath, file), { recursive: true, @@ -104,10 +89,19 @@ for (const file of fs.readdirSync(preferredArtifactSourcePath)) { // handle hermesvm.xcframework / hermes.xcframework let hermesArtifactFound = false; -for (const candidateDir of ['hermes.xcframework', 'hermesvm.xcframework']) { - if (fs.existsSync(path.join(targetPackagePath, candidateDir))) { +if (fs.existsSync(path.join(targetPackagePath, 'hermesvm.xcframework'))) { + hermesArtifactFound = true; +} + +if (fs.existsSync(path.join(targetPackagePath, 'hermes.xcframework'))) { + if (hermesArtifactFound) { + fs.rmSync(path.join(targetPackagePath, 'hermes.xcframework'), { + recursive: true, + force: true, + }); + } else { fs.renameSync( - path.join(targetPackagePath, candidateDir), + path.join(targetPackagePath, 'hermes.xcframework'), path.join(targetPackagePath, 'hermesvm.xcframework') ); hermesArtifactFound = true; @@ -118,23 +112,8 @@ if (!hermesArtifactFound) { throw new Error('Hermes artifact not found'); } -for (const artifact of prebuiltRnCoreArtifacts) { - const xcframeworkPath = path.join(targetPackagePath, artifact); - if (!fs.existsSync(xcframeworkPath)) { - continue; - } - - // RN prebuilts ship with a sealed signature that CocoaPods/brownfield packaging - // can invalidate (module.modulemap drift). Re-sign locally so Xcode can embed them. - logger.info(`Re-signing ${artifact} for AppleApp consumer build`); - execFileSync('codesign', ['--force', '--sign', '-', '--deep', xcframeworkPath], { - stdio: 'inherit', - }); - logger.success(`${artifact} re-signed`); -} - for (const file of fs.readdirSync(targetPackagePath)) { - if (!validNames.includes(file)) { + if (!file.endsWith('.xcframework')) { throw new Error(`Invalid file name: ${file}`); } diff --git a/apps/ExpoApp54/.detoxrc.cjs b/apps/ExpoApp54/.detoxrc.cjs deleted file mode 100644 index ff9deffb..00000000 --- a/apps/ExpoApp54/.detoxrc.cjs +++ /dev/null @@ -1,13 +0,0 @@ -const { - createIosSimDebugDetoxConfig, -} = require('../brownfield-example-shared-tests/detox-rc-ios-sim-debug.cjs'); - -/** - * Requires a native tree from `expo prebuild` / `expo run:ios` (ios/ + Pods). - * @type {import('detox').DetoxConfig} - */ -module.exports = createIosSimDebugDetoxConfig({ - workspace: 'ExpoApp54', - scheme: 'ExpoApp54', - appBinaryName: 'ExpoApp54', -}); diff --git a/apps/ExpoApp54/.expo/cache/eslint/.cache_8c8qgw b/apps/ExpoApp54/.expo/cache/eslint/.cache_8c8qgw new file mode 100644 index 00000000..50c4c148 --- /dev/null +++ b/apps/ExpoApp54/.expo/cache/eslint/.cache_8c8qgw @@ -0,0 +1 @@ +[{"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/(tabs)/_layout.tsx":"1","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/(tabs)/explore.tsx":"2","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/(tabs)/index.tsx":"3","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/(tabs)/postMessage.tsx":"4","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/_layout.tsx":"5","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/modal.tsx":"6","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/counter/index.tsx":"7","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/external-link.tsx":"8","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/haptic-tab.tsx":"9","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/hello-wave.tsx":"10","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/parallax-scroll-view.tsx":"11","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/postMessage/Message.ts":"12","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/postMessage/MessageBubble.tsx":"13","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/themed-text.tsx":"14","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/themed-view.tsx":"15","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/ui/collapsible.tsx":"16","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/ui/icon-symbol.ios.tsx":"17","/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/ui/icon-symbol.tsx":"18"},{"size":1269,"mtime":1778151798124,"results":"19","hashOfConfig":"20"},{"size":4538,"mtime":1778151798124,"results":"21","hashOfConfig":"20"},{"size":3404,"mtime":1778151798124,"results":"22","hashOfConfig":"20"},{"size":2873,"mtime":1778151798124,"results":"23","hashOfConfig":"20"},{"size":775,"mtime":1778151798125,"results":"24","hashOfConfig":"20"},{"size":703,"mtime":1778151798125,"results":"25","hashOfConfig":"20"},{"size":561,"mtime":1778151798127,"results":"26","hashOfConfig":"20"},{"size":802,"mtime":1778151798127,"results":"27","hashOfConfig":"20"},{"size":564,"mtime":1778151798127,"results":"28","hashOfConfig":"20"},{"size":410,"mtime":1778151798127,"results":"29","hashOfConfig":"20"},{"size":2056,"mtime":1778151798127,"results":"30","hashOfConfig":"20"},{"size":105,"mtime":1778151798127,"results":"31","hashOfConfig":"20"},{"size":1791,"mtime":1778151798127,"results":"32","hashOfConfig":"20"},{"size":1285,"mtime":1778151798127,"results":"33","hashOfConfig":"20"},{"size":490,"mtime":1778151798127,"results":"34","hashOfConfig":"20"},{"size":1374,"mtime":1778151798127,"results":"35","hashOfConfig":"20"},{"size":598,"mtime":1778151798127,"results":"36","hashOfConfig":"20"},{"size":1569,"mtime":1778151798128,"results":"37","hashOfConfig":"20"},{"filePath":"38","messages":"39","suppressedMessages":"40","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1msu1qa",{"filePath":"41","messages":"42","suppressedMessages":"43","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"44","messages":"45","suppressedMessages":"46","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"47","messages":"48","suppressedMessages":"49","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"50","messages":"51","suppressedMessages":"52","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"53","messages":"54","suppressedMessages":"55","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"56","messages":"57","suppressedMessages":"58","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"59","messages":"60","suppressedMessages":"61","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"62","messages":"63","suppressedMessages":"64","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"65","messages":"66","suppressedMessages":"67","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"68","messages":"69","suppressedMessages":"70","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"71","messages":"72","suppressedMessages":"73","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"74","messages":"75","suppressedMessages":"76","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"77","messages":"78","suppressedMessages":"79","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"80","messages":"81","suppressedMessages":"82","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"83","messages":"84","suppressedMessages":"85","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"86","messages":"87","suppressedMessages":"88","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"89","messages":"90","suppressedMessages":"91","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/(tabs)/_layout.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/(tabs)/explore.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/(tabs)/index.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/(tabs)/postMessage.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/_layout.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/app/modal.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/counter/index.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/external-link.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/haptic-tab.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/hello-wave.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/parallax-scroll-view.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/postMessage/Message.ts",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/postMessage/MessageBubble.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/themed-text.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/themed-view.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/ui/collapsible.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/ui/icon-symbol.ios.tsx",[],[],"/Users/daniel.potor/Desktop/CK/react-native-brownfield/apps/ExpoApp54/components/ui/icon-symbol.tsx",[],[]] \ No newline at end of file diff --git a/apps/ExpoApp54/__tests__/brownfield.example.test.tsx b/apps/ExpoApp54/__tests__/brownfield.example.test.tsx deleted file mode 100644 index e5309813..00000000 --- a/apps/ExpoApp54/__tests__/brownfield.example.test.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import PostMessageTab from '../app/(tabs)/postMessage'; -import Counter from '../components/counter'; -import RNApp from '../RNApp'; -import { - runPostMessageTabSuite, - runCounterSuite, - runExpoRnAppSuite, -} from '@callstack/brownfield-example-shared-tests'; - -runPostMessageTabSuite('ExpoApp54', PostMessageTab); -runCounterSuite('ExpoApp54', Counter); -runExpoRnAppSuite('ExpoApp54', RNApp); diff --git a/apps/ExpoApp54/app/(tabs)/_layout.tsx b/apps/ExpoApp54/app/(tabs)/_layout.tsx deleted file mode 100644 index ce946ec7..00000000 --- a/apps/ExpoApp54/app/(tabs)/_layout.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { Tabs } from 'expo-router'; -import React from 'react'; - -import { HapticTab } from '@/components/haptic-tab'; -import { IconSymbol } from '@/components/ui/icon-symbol'; -import { Colors } from '@/constants/theme'; -import { useColorScheme } from '@/hooks/use-color-scheme'; - -export default function TabLayout() { - const colorScheme = useColorScheme(); - - return ( - - ( - - ), - }} - /> - ( - - ), - }} - /> - ( - - ), - }} - /> - - ); -} diff --git a/apps/ExpoApp54/app/(tabs)/explore.tsx b/apps/ExpoApp54/app/(tabs)/explore.tsx deleted file mode 100644 index 7b16e871..00000000 --- a/apps/ExpoApp54/app/(tabs)/explore.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import { Image } from 'expo-image'; -import { Platform, StyleSheet } from 'react-native'; - -import { Collapsible } from '@/components/ui/collapsible'; -import { ExternalLink } from '@/components/external-link'; -import ParallaxScrollView from '@/components/parallax-scroll-view'; -import { ThemedText } from '@/components/themed-text'; -import { ThemedView } from '@/components/themed-view'; -import { IconSymbol } from '@/components/ui/icon-symbol'; -import { Fonts } from '@/constants/theme'; - -export default function TabTwoScreen() { - return ( - - } - > - - - Explore - - - - This app includes example code to help you get started. - - - - This app has two screens:{' '} - app/(tabs)/index.tsx{' '} - and{' '} - app/(tabs)/explore.tsx - - - The layout file in{' '} - app/(tabs)/_layout.tsx{' '} - sets up the tab navigator. - - - Learn more - - - - - You can open this project on Android, iOS, and the web. To open the - web version, press w{' '} - in the terminal running this project. - - - - - For static images, you can use the{' '} - @2x and{' '} - @3x suffixes to - provide files for different screen densities - - - - Learn more - - - - - This template has light and dark mode support. The{' '} - useColorScheme() hook - lets you inspect what the user's current color scheme is, and so - you can adjust UI colors accordingly. - - - Learn more - - - - - This template includes an example of an animated component. The{' '} - - components/HelloWave.tsx - {' '} - component uses the powerful{' '} - - react-native-reanimated - {' '} - library to create a waving hand animation. - - {Platform.select({ - ios: ( - - The{' '} - - components/ParallaxScrollView.tsx - {' '} - component provides a parallax effect for the header image. - - ), - })} - - - ); -} - -const styles = StyleSheet.create({ - headerImage: { - color: '#808080', - bottom: -90, - left: -35, - position: 'absolute', - }, - titleContainer: { - flexDirection: 'row', - gap: 8, - }, -}); diff --git a/apps/ExpoApp54/app/(tabs)/index.tsx b/apps/ExpoApp54/app/(tabs)/index.tsx deleted file mode 100644 index 97e4a70d..00000000 --- a/apps/ExpoApp54/app/(tabs)/index.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import { Image } from 'expo-image'; -import { Link } from 'expo-router'; -import { Button, Platform, StyleSheet, View } from 'react-native'; - -import { HelloWave } from '@/components/hello-wave'; -import ParallaxScrollView from '@/components/parallax-scroll-view'; -import { ThemedText } from '@/components/themed-text'; -import { ThemedView } from '@/components/themed-view'; -import { checkAndFetchUpdate } from '@/utils/expo-rn-updates'; - -export default function HomeScreen() { - return ( - - - } - > - - Welcome to Expo 54! - - - -