From 2348da1b90cf7a97353aba67bd32d938252d222f Mon Sep 17 00:00:00 2001 From: Artur Morys-Magiera Date: Tue, 30 Jun 2026 15:02:44 +0200 Subject: [PATCH 01/22] fix(ci): upgrade changesets action to newest version (#404) --- .github/workflows/release.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 From 025372afa3b461e107a45935dccd32f9e37e1a48 Mon Sep 17 00:00:00 2001 From: Artur Morys-Magiera Date: Tue, 30 Jun 2026 15:48:13 +0200 Subject: [PATCH 02/22] fix(ci): resolve changesets failing on CI due to cached faulty NodeJS version (#405) --- .github/actions/setup/action.yml | 2 ++ 1 file changed, 2 insertions(+) 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 From 9c0ee0f33ae3c574b0395a466b49520b6a9f5c41 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 09:37:03 +0200 Subject: [PATCH 03/22] chore(release): version packages (#399) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/fair-swans-remain.md | 5 ----- .changeset/nine-mice-fall.md | 6 ------ .changeset/vast-waves-itch.md | 6 ------ .changeset/young-snails-lose.md | 5 ----- CHANGELOG.md | 15 +++++++++++++++ packages/brownfield-navigation/CHANGELOG.md | 7 +++++++ packages/brownfield-navigation/package.json | 2 +- packages/brownfield/CHANGELOG.md | 7 +++++++ packages/brownfield/package.json | 2 +- packages/brownie/CHANGELOG.md | 7 +++++++ packages/brownie/package.json | 2 +- packages/cli/CHANGELOG.md | 10 ++++++++++ packages/cli/package.json | 2 +- packages/react-native-brownfield/CHANGELOG.md | 13 +++++++++++++ packages/react-native-brownfield/package.json | 2 +- 15 files changed, 64 insertions(+), 27 deletions(-) delete mode 100644 .changeset/fair-swans-remain.md delete mode 100644 .changeset/nine-mice-fall.md delete mode 100644 .changeset/vast-waves-itch.md delete mode 100644 .changeset/young-snails-lose.md 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/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/CHANGELOG.md b/CHANGELOG.md index 8c22e915..e8f9ca90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ _History prior to 3.7.0 is available in the per-package CHANGELOG files._ +## 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/packages/brownfield-navigation/CHANGELOG.md b/packages/brownfield-navigation/CHANGELOG.md index 44dfacee..3cf4e73c 100644 --- a/packages/brownfield-navigation/CHANGELOG.md +++ b/packages/brownfield-navigation/CHANGELOG.md @@ -1,5 +1,12 @@ # @callstack/brownfield-navigation +## 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 + ## 3.13.1 ### Patch Changes diff --git a/packages/brownfield-navigation/package.json b/packages/brownfield-navigation/package.json index cc6d1e22..2c26f46d 100644 --- a/packages/brownfield-navigation/package.json +++ b/packages/brownfield-navigation/package.json @@ -1,6 +1,6 @@ { "name": "@callstack/brownfield-navigation", - "version": "3.13.1", + "version": "3.13.2", "license": "MIT", "author": "Hur Ali", "description": "Brownfield navigation helpers for React Native", diff --git a/packages/brownfield/CHANGELOG.md b/packages/brownfield/CHANGELOG.md index 149d6f42..c068aaf6 100644 --- a/packages/brownfield/CHANGELOG.md +++ b/packages/brownfield/CHANGELOG.md @@ -1,5 +1,12 @@ # brownfield +## 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 + ## 3.13.1 ### Patch Changes diff --git a/packages/brownfield/package.json b/packages/brownfield/package.json index 1b173a07..5b3d6441 100644 --- a/packages/brownfield/package.json +++ b/packages/brownfield/package.json @@ -1,6 +1,6 @@ { "name": "brownfield", - "version": "3.13.1", + "version": "3.13.2", "license": "MIT", "author": "Artur Morys-Magiera ", "bin": "dist/index.js", diff --git a/packages/brownie/CHANGELOG.md b/packages/brownie/CHANGELOG.md index e6be96a5..a051a785 100644 --- a/packages/brownie/CHANGELOG.md +++ b/packages/brownie/CHANGELOG.md @@ -1,5 +1,12 @@ # @callstack/brownie +## 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 + ## 3.13.1 ### Patch Changes diff --git a/packages/brownie/package.json b/packages/brownie/package.json index a67289ed..c4748829 100644 --- a/packages/brownie/package.json +++ b/packages/brownie/package.json @@ -1,6 +1,6 @@ { "name": "@callstack/brownie", - "version": "3.13.1", + "version": "3.13.2", "license": "MIT", "author": "Oskar Kwaśniewski ", "bin": { diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index d313af2c..6fba8121 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,15 @@ # @callstack/brownfield-cli +## 3.13.2 + +### Patch Changes + +- [#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 + ## 3.13.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index ded2a1b0..996d58a1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@callstack/brownfield-cli", - "version": "3.13.1", + "version": "3.13.2", "license": "MIT", "author": "Artur Morys-Magiera ", "bin": { diff --git a/packages/react-native-brownfield/CHANGELOG.md b/packages/react-native-brownfield/CHANGELOG.md index 4a8840e5..fe8573cb 100644 --- a/packages/react-native-brownfield/CHANGELOG.md +++ b/packages/react-native-brownfield/CHANGELOG.md @@ -1,5 +1,18 @@ # @callstack/react-native-brownfield +## 3.13.2 + +### Patch Changes + +- [#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 + +- [#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 + +- 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 + ## 3.13.1 ### Patch Changes diff --git a/packages/react-native-brownfield/package.json b/packages/react-native-brownfield/package.json index a23d3777..a30a36a2 100644 --- a/packages/react-native-brownfield/package.json +++ b/packages/react-native-brownfield/package.json @@ -1,6 +1,6 @@ { "name": "@callstack/react-native-brownfield", - "version": "3.13.1", + "version": "3.13.2", "license": "MIT", "author": "Michal Chudziak ", "bin": { From 10ff597c057c04aa093b4e5ae8c5334b169d3d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Trzci=C5=84ski?= Date: Thu, 2 Jul 2026 14:16:44 +0200 Subject: [PATCH 04/22] feat: add Expo 56 support (#360) * feat: add initial Expo 56 support * refactor: inherit Expo native floors from app project * fix: stabilize RNApp brownfield test apps * chore: refresh lockfile for Expo peer range * fix: avoid duplicating iOS brownfield targets * feat: stabilize Expo 56 support matrix * fix: restore gradle plugin string extension import * fix: align android expo CI artifact checks * fix: support expo android maven artifact naming * fix: support Expo 55/56 iOS packaging * fix: normalize Expo prebuilt iOS flags in CI * fix: normalize Expo iOS search paths in CI * fix: disable Expo release swift interface verification * fix: stabilize Expo and bare RN example builds * fix: address expo 56 PR review feedback * fix: tighten expo 56 android support changes * refactor: drop custom iOS packaging path from expo 56 PR * fix: restore expo56 CI coverage * fix: stabilize expo 55 and 56 native support * fix: restore brownfield-navigation formatting * fix: align AppleApp Expo 56 e2e entrypoint * fix: invalidate brownfield-navigation build cache * ci: drop Expo 54 road tests * fix: avoid AppleApp Detox RN reloads * fix: harden Expo Android brownfield publishing * fix: stabilize Android Expo road tests * fix: stabilize AppleApp Expo 56 Detox flow * fix: repair android road test CI * fix(ci): harden expo road test checks * fix: align expo android hermes runtime * refactor: remove not required code * revert: navigation * revert: navigation * revert: navigation * refactor: unused code * refactor: remove unused code * refactor: remove unused code * refactor: cleanup * feat: add prebuilt expo modules emit support * refactor: cleanup * refactor: cleanup * refactor: cleanup * feat: add support to emit swift and expo frameworks with mergeFramework patch * refactor: cleanup * chore: add changeset * refactor: cleanup * fix: header support * docs: update * feat: add option for expo prebuilt * fix: test * chore: update rock --------- Co-authored-by: Hur Ali --- .changeset/hip-flies-guess.md | 8 + .github/workflows/ci.yml | 18 +- apps/AndroidApp/app/build.gradle.kts | 6 +- .../android/expo/BrownfieldStore.kt | 4 + .../android/expo/ReactNativeConstants.kt | 6 + .../android/expo/ReactNativeHostManager.kt | 3 + apps/AndroidApp/gradle/libs.versions.toml | 2 +- apps/AndroidApp/package.json | 3 +- apps/AppleApp/.detoxrc.expo56.cjs | 17 + .../project.pbxproj | 408 +++- .../Brownfield Apple App Expo 56.xcscheme | 52 + .../xcschemes/xcschememanagement.plist | 10 + .../components/ContentView.swift | 4 - apps/AppleApp/e2e/jest.config.expo56.cjs | 19 + apps/AppleApp/package.json | 8 +- apps/AppleApp/prepareXCFrameworks.js | 57 +- apps/ExpoApp56/.gitignore | 43 + apps/ExpoApp56/BrownfieldStore.brownie.ts | 21 + apps/ExpoApp56/README.md | 56 + apps/ExpoApp56/RNApp.tsx | 77 + .../__tests__/brownfield.example.test.tsx | 12 + apps/ExpoApp56/app.json | 61 + .../assets/expo.icon/Assets/expo-symbol 2.svg | 3 + .../assets/expo.icon/Assets/grid.png | Bin 0 -> 53681 bytes apps/ExpoApp56/assets/expo.icon/icon.json | 40 + .../assets/images/android-icon-background.png | Bin 0 -> 17549 bytes .../assets/images/android-icon-foreground.png | Bin 0 -> 78796 bytes .../assets/images/android-icon-monochrome.png | Bin 0 -> 4140 bytes .../assets/images/expo-badge-white.png | Bin 0 -> 4129 bytes apps/ExpoApp56/assets/images/expo-badge.png | Bin 0 -> 4137 bytes apps/ExpoApp56/assets/images/expo-logo.png | Bin 0 -> 3317 bytes apps/ExpoApp56/assets/images/favicon.png | Bin 0 -> 1129 bytes apps/ExpoApp56/assets/images/icon.png | Bin 0 -> 799005 bytes apps/ExpoApp56/assets/images/logo-glow.png | Bin 0 -> 331624 bytes apps/ExpoApp56/assets/images/react-logo.png | Bin 0 -> 6341 bytes .../ExpoApp56/assets/images/react-logo@2x.png | Bin 0 -> 14225 bytes .../ExpoApp56/assets/images/react-logo@3x.png | Bin 0 -> 21252 bytes apps/ExpoApp56/assets/images/splash-icon.png | Bin 0 -> 3317 bytes .../assets/images/tabIcons/explore.png | Bin 0 -> 215 bytes .../assets/images/tabIcons/explore@2x.png | Bin 0 -> 347 bytes .../assets/images/tabIcons/explore@3x.png | Bin 0 -> 468 bytes .../ExpoApp56/assets/images/tabIcons/home.png | Bin 0 -> 253 bytes .../assets/images/tabIcons/home@2x.png | Bin 0 -> 343 bytes .../assets/images/tabIcons/home@3x.png | Bin 0 -> 479 bytes apps/ExpoApp56/assets/images/tutorial-web.png | Bin 0 -> 58959 bytes apps/ExpoApp56/brownfield.navigation.ts | 25 + apps/ExpoApp56/entry.tsx | 12 + apps/ExpoApp56/eslint.config.js | 18 + apps/ExpoApp56/jest.config.js | 13 + apps/ExpoApp56/jest.setup.js | 1 + apps/ExpoApp56/jest/cssMock.js | 2 + apps/ExpoApp56/package.json | 69 + apps/ExpoApp56/src/app/_layout.tsx | 19 + apps/ExpoApp56/src/app/explore.tsx | 180 ++ apps/ExpoApp56/src/app/index.tsx | 101 + apps/ExpoApp56/src/app/postMessage.tsx | 107 + .../src/components/animated-icon.module.css | 6 + .../src/components/animated-icon.tsx | 132 + .../src/components/animated-icon.web.tsx | 108 + apps/ExpoApp56/src/components/app-tabs.tsx | 48 + .../ExpoApp56/src/components/app-tabs.web.tsx | 115 + .../src/components/counter/index.tsx | 33 + .../src/components/external-link.tsx | 25 + apps/ExpoApp56/src/components/hint-row.tsx | 35 + .../src/components/postMessage/Message.ts | 6 + .../components/postMessage/MessageBubble.tsx | 81 + apps/ExpoApp56/src/components/themed-text.tsx | 73 + apps/ExpoApp56/src/components/themed-view.tsx | 16 + .../src/components/ui/collapsible.tsx | 65 + apps/ExpoApp56/src/components/web-badge.tsx | 43 + apps/ExpoApp56/src/constants/theme.ts | 65 + apps/ExpoApp56/src/global.css | 9 + apps/ExpoApp56/src/hooks/use-color-scheme.ts | 1 + .../src/hooks/use-color-scheme.web.ts | 18 + apps/ExpoApp56/src/hooks/use-theme.ts | 14 + apps/ExpoApp56/src/utils/expo-rn-updates.ts | 25 + apps/ExpoApp56/tsconfig.json | 20 + apps/README.md | 7 +- apps/RNApp/brownfield.config.js | 2 +- apps/RNApp/ios/Podfile.lock | 18 +- .../RNApp/ios/RNApp.xcodeproj/project.pbxproj | 24 +- .../detox-appleapp-variants.cjs | 16 +- .../e2e/appleAppDetoxUtils.cjs | 199 +- .../e2e/appleAppExpoBrownfield.e2e.js | 4 +- .../e2e/e2eTestIds.cjs | 2 + .../src/e2eTestIds.ts | 2 + docs/docs/docs/cli/brownfield.mdx | 1 + docs/docs/docs/getting-started/examples.mdx | 6 +- docs/docs/docs/getting-started/expo.mdx | 6 +- docs/docs/docs/getting-started/ios.mdx | 29 +- docs/docs/docs/guides/expo-updates/how-to.mdx | 3 +- docs/docs/public/images/expo-frameworks.png | Bin 0 -> 354663 bytes gradle-plugins/react/README.md | 2 +- .../plugin/ProjectConfigurations.kt | 5 +- .../react/brownfield/plugin/RNSourceSets.kt | 1 - package.json | 4 +- .../BrownfieldNavigation.podspec | 1 + packages/brownfield-navigation/turbo.json | 4 + packages/brownie/Brownie.podspec | 3 +- packages/cli/package.json | 10 +- packages/cli/schema.json | 4 + .../__tests__/packageIos.action.test.ts | 80 +- .../commands/__tests__/packageIos.test.ts | 28 + .../cli/src/brownfield/commands/packageIos.ts | 51 +- .../__tests__/createLocalSpmPackage.test.ts | 76 +- .../emitExpoSupportXcframeworks.test.ts | 244 ++ .../__tests__/supportsPrebuiltExpo.test.ts | 63 + .../brownfield/utils/createLocalSpmPackage.ts | 16 +- .../utils/emitExpoSupportXcframeworks.ts | 132 + .../utils/normalizeCopiedXcframework.ts | 90 + .../utils/prepareLocalSpmArtifacts.ts | 97 +- .../brownfield/utils/supportsPrebuiltExpo.ts | 34 + packages/cli/src/types.ts | 3 + .../ReactBrownfield.podspec | 2 +- .../react-native-brownfield/app.plugin.js | 1 + packages/react-native-brownfield/package.json | 5 +- .../android/__tests__/gradleHelpers.test.ts | 62 + .../__tests__/withAndroidModuleFiles.test.ts | 110 +- .../android/utils/__tests__/hermes.test.ts | 56 +- .../android/utils/hermes.ts | 89 +- .../android/withAndroidModuleFiles.ts | 28 +- .../ios/__tests__/withFmtFix.test.ts | 43 +- .../ios/__tests__/xcodeHelpers.test.ts | 21 + .../expo-config-plugin/ios/podfileHelpers.ts | 13 +- .../ios/withBrownfieldIos.ts | 11 +- .../src/expo-config-plugin/ios/withFmtFix.ts | 64 +- .../expo-config-plugin/ios/xcodeHelpers.ts | 63 +- .../template/android/build.gradle.kts | 20 +- .../android/BrownfieldPluginAndroidConfig.ts | 10 +- .../types/ios/BrownfieldPluginIosConfig.ts | 8 +- yarn.lock | 2147 ++++++++++++++++- 131 files changed, 6090 insertions(+), 353 deletions(-) create mode 100644 .changeset/hip-flies-guess.md create mode 100644 apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt create mode 100644 apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt create mode 100644 apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt create mode 100644 apps/AppleApp/.detoxrc.expo56.cjs create mode 100644 apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 56.xcscheme create mode 100644 apps/AppleApp/e2e/jest.config.expo56.cjs create mode 100644 apps/ExpoApp56/.gitignore create mode 100644 apps/ExpoApp56/BrownfieldStore.brownie.ts create mode 100644 apps/ExpoApp56/README.md create mode 100644 apps/ExpoApp56/RNApp.tsx create mode 100644 apps/ExpoApp56/__tests__/brownfield.example.test.tsx create mode 100644 apps/ExpoApp56/app.json create mode 100644 apps/ExpoApp56/assets/expo.icon/Assets/expo-symbol 2.svg create mode 100644 apps/ExpoApp56/assets/expo.icon/Assets/grid.png create mode 100644 apps/ExpoApp56/assets/expo.icon/icon.json create mode 100644 apps/ExpoApp56/assets/images/android-icon-background.png create mode 100644 apps/ExpoApp56/assets/images/android-icon-foreground.png create mode 100644 apps/ExpoApp56/assets/images/android-icon-monochrome.png create mode 100644 apps/ExpoApp56/assets/images/expo-badge-white.png create mode 100644 apps/ExpoApp56/assets/images/expo-badge.png create mode 100644 apps/ExpoApp56/assets/images/expo-logo.png create mode 100644 apps/ExpoApp56/assets/images/favicon.png create mode 100644 apps/ExpoApp56/assets/images/icon.png create mode 100644 apps/ExpoApp56/assets/images/logo-glow.png create mode 100644 apps/ExpoApp56/assets/images/react-logo.png create mode 100644 apps/ExpoApp56/assets/images/react-logo@2x.png create mode 100644 apps/ExpoApp56/assets/images/react-logo@3x.png create mode 100644 apps/ExpoApp56/assets/images/splash-icon.png create mode 100644 apps/ExpoApp56/assets/images/tabIcons/explore.png create mode 100644 apps/ExpoApp56/assets/images/tabIcons/explore@2x.png create mode 100644 apps/ExpoApp56/assets/images/tabIcons/explore@3x.png create mode 100644 apps/ExpoApp56/assets/images/tabIcons/home.png create mode 100644 apps/ExpoApp56/assets/images/tabIcons/home@2x.png create mode 100644 apps/ExpoApp56/assets/images/tabIcons/home@3x.png create mode 100644 apps/ExpoApp56/assets/images/tutorial-web.png create mode 100644 apps/ExpoApp56/brownfield.navigation.ts create mode 100644 apps/ExpoApp56/entry.tsx create mode 100644 apps/ExpoApp56/eslint.config.js create mode 100644 apps/ExpoApp56/jest.config.js create mode 100644 apps/ExpoApp56/jest.setup.js create mode 100644 apps/ExpoApp56/jest/cssMock.js create mode 100644 apps/ExpoApp56/package.json create mode 100644 apps/ExpoApp56/src/app/_layout.tsx create mode 100644 apps/ExpoApp56/src/app/explore.tsx create mode 100644 apps/ExpoApp56/src/app/index.tsx create mode 100644 apps/ExpoApp56/src/app/postMessage.tsx create mode 100644 apps/ExpoApp56/src/components/animated-icon.module.css create mode 100644 apps/ExpoApp56/src/components/animated-icon.tsx create mode 100644 apps/ExpoApp56/src/components/animated-icon.web.tsx create mode 100644 apps/ExpoApp56/src/components/app-tabs.tsx create mode 100644 apps/ExpoApp56/src/components/app-tabs.web.tsx create mode 100644 apps/ExpoApp56/src/components/counter/index.tsx create mode 100644 apps/ExpoApp56/src/components/external-link.tsx create mode 100644 apps/ExpoApp56/src/components/hint-row.tsx create mode 100644 apps/ExpoApp56/src/components/postMessage/Message.ts create mode 100644 apps/ExpoApp56/src/components/postMessage/MessageBubble.tsx create mode 100644 apps/ExpoApp56/src/components/themed-text.tsx create mode 100644 apps/ExpoApp56/src/components/themed-view.tsx create mode 100644 apps/ExpoApp56/src/components/ui/collapsible.tsx create mode 100644 apps/ExpoApp56/src/components/web-badge.tsx create mode 100644 apps/ExpoApp56/src/constants/theme.ts create mode 100644 apps/ExpoApp56/src/global.css create mode 100644 apps/ExpoApp56/src/hooks/use-color-scheme.ts create mode 100644 apps/ExpoApp56/src/hooks/use-color-scheme.web.ts create mode 100644 apps/ExpoApp56/src/hooks/use-theme.ts create mode 100644 apps/ExpoApp56/src/utils/expo-rn-updates.ts create mode 100644 apps/ExpoApp56/tsconfig.json create mode 100644 docs/docs/public/images/expo-frameworks.png create mode 100644 packages/cli/src/brownfield/utils/__tests__/emitExpoSupportXcframeworks.test.ts create mode 100644 packages/cli/src/brownfield/utils/__tests__/supportsPrebuiltExpo.test.ts create mode 100644 packages/cli/src/brownfield/utils/emitExpoSupportXcframeworks.ts create mode 100644 packages/cli/src/brownfield/utils/normalizeCopiedXcframework.ts create mode 100644 packages/cli/src/brownfield/utils/supportsPrebuiltExpo.ts create mode 100644 packages/react-native-brownfield/app.plugin.js create mode 100644 packages/react-native-brownfield/src/expo-config-plugin/android/__tests__/gradleHelpers.test.ts diff --git a/.changeset/hip-flies-guess.md b/.changeset/hip-flies-guess.md new file mode 100644 index 00000000..3db5bf85 --- /dev/null +++ b/.changeset/hip-flies-guess.md @@ -0,0 +1,8 @@ +--- +'@callstack/react-native-brownfield': minor +'@callstack/brownfield-navigation': minor +'@callstack/brownie': minor +'@callstack/brownfield-cli': minor +--- + +Expo SDK 56 support diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1cc8dc6..5501e984 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,8 +22,8 @@ jobs: outputs: packages: ${{ steps.filter.outputs.packages }} rnapp: ${{ steps.filter.outputs.rnapp }} - expo54: ${{ steps.filter.outputs.expo54 }} expo55: ${{ steps.filter.outputs.expo55 }} + expo56: ${{ steps.filter.outputs.expo56 }} androidapp: ${{ steps.filter.outputs.androidapp }} appleapp: ${{ steps.filter.outputs.appleapp }} ci: ${{ steps.filter.outputs.ci }} @@ -41,12 +41,12 @@ 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/**' appleapp: @@ -135,8 +135,8 @@ 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.ci == 'true' @@ -145,8 +145,8 @@ jobs: strategy: matrix: include: - - version: '54' - version: '55' + - version: '56' steps: - name: Checkout @@ -219,8 +219,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' @@ -229,10 +229,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/apps/AndroidApp/app/build.gradle.kts b/apps/AndroidApp/app/build.gradle.kts index ce3fd9b8..d6f7866c 100644 --- a/apps/AndroidApp/app/build.gradle.kts +++ b/apps/AndroidApp/app/build.gradle.kts @@ -36,6 +36,9 @@ android { create("expo55") { dimension = "app" } + create("expo56") { + dimension = "app" + } create("expobeta") { dimension = "app" } @@ -76,8 +79,9 @@ dependencies { implementation(libs.androidx.compose.material3) implementation(libs.androidx.appcompat) add("expo55Implementation", libs.brownfieldlib.expo55) - add("expobetaImplementation", libs.brownfieldlib.expobeta) + add("expo56Implementation", libs.brownfieldlib.expo56) add("expo54Implementation", libs.brownfieldlib.expo54) + add("expobetaImplementation", libs.brownfieldlib.expobeta) add("vanillaImplementation", libs.brownfieldlib.vanilla) implementation(libs.androidx.fragment.compose) diff --git a/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt new file mode 100644 index 00000000..c9e8fa11 --- /dev/null +++ b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/BrownfieldStore.kt @@ -0,0 +1,4 @@ +package com.callstack.brownfield.android.example + +typealias BrownfieldStore = com.callstack.rnbrownfield.demo.expoapp56.BrownfieldStore +typealias User = com.callstack.rnbrownfield.demo.expoapp56.User diff --git a/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt new file mode 100644 index 00000000..dfd59f51 --- /dev/null +++ b/apps/AndroidApp/app/src/expo56/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 56)" +} diff --git a/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt new file mode 100644 index 00000000..c317ce58 --- /dev/null +++ b/apps/AndroidApp/app/src/expo56/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt @@ -0,0 +1,3 @@ +package com.callstack.brownfield.android.example + +typealias ReactNativeHostManager = com.callstack.rnbrownfield.demo.expoapp56.ReactNativeHostManager diff --git a/apps/AndroidApp/gradle/libs.versions.toml b/apps/AndroidApp/gradle/libs.versions.toml index f52bd562..b72dcfc6 100644 --- a/apps/AndroidApp/gradle/libs.versions.toml +++ b/apps/AndroidApp/gradle/libs.versions.toml @@ -16,6 +16,7 @@ gson = "2.13.2" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +brownfieldlib-expo56 = { module = "com.callstack.rnbrownfield.demo.expoapp56:brownfieldlib", version.ref = "brownfieldlib" } brownfieldlib-expo55 = { module = "com.callstack.rnbrownfield.demo.expoapp55:brownfieldlib", version.ref = "brownfieldlib" } brownfieldlib-expobeta = { module = "com.callstack.rnbrownfield.demo.expobeta:brownfieldlib", version.ref = "brownfieldlib" } brownfieldlib-expo54 = { module = "com.callstack.rnbrownfield.demo.expoapp54:brownfieldlib", version.ref = "brownfieldlib" } @@ -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 8ee08845..af635291 100644 --- a/apps/AndroidApp/package.json +++ b/apps/AndroidApp/package.json @@ -3,7 +3,8 @@ "version": "0.0.1", "private": true, "scripts": { - "build:example:android-consumer:expo": "./gradlew assembleExpo55Release", + "build:example:android-consumer:expo": "./gradlew assembleExpo56Release", + "build:example:android-consumer:expo56": "./gradlew assembleExpo56Release", "build:example:android-consumer:expo55": "./gradlew assembleExpo55Release", "build:example:android-consumer:expobeta": "./gradlew assembleExpobetaRelease", "build:example:android-consumer:expo54": "./gradlew assembleExpo54Release", 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..de638d37 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj @@ -7,6 +7,28 @@ 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, ); }; }; 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 */; }; @@ -45,6 +67,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 */; }; @@ -111,6 +147,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; @@ -131,6 +195,17 @@ /* 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 = ""; }; 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 = ""; }; @@ -141,12 +216,50 @@ 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; }; + 79B8BEB22FB8000000B94C6F /* Brownfield Apple App (ExpoApp56).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoApp56).app"; sourceTree = BUILT_PRODUCTS_DIR; }; 7A1B2C3D4E5F60718293A202 /* Brownfield Apple App (ExpoAppBeta).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoAppBeta).app"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 79B8BE822FB7270F00B94C6F /* Exceptions for "Brownfield Apple App" folder in "Brownfield Apple App (ExpoApp54)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Assets.xcassets, + BrownfieldAppleApp.swift, + components/ContentView.swift, + components/GreetingCard.swift, + components/MaterialCard.swift, + components/MessagesView.swift, + components/ReferralsScreen.swift, + components/SettingsScreen.swift, + components/Toast.swift, + ); + target = 79B8BE682FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54) */; + }; + 7A1B2C3D4E5F60718293A203 /* Exceptions for "Brownfield Apple App" folder in "Brownfield Apple App (ExpoAppBeta)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Assets.xcassets, + BrownfieldAppleApp.swift, + components/ContentView.swift, + components/GreetingCard.swift, + components/MaterialCard.swift, + components/MessagesView.swift, + components/ReferralsScreen.swift, + components/SettingsScreen.swift, + components/Toast.swift, + ); + target = 7A1B2C3D4E5F60718293A301 /* Brownfield Apple App (ExpoAppBeta) */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + /* Begin PBXFileSystemSynchronizedRootGroup section */ 793C76A92EEBF938008A2A34 /* Brownfield Apple App */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 79B8BE822FB7270F00B94C6F /* Exceptions for "Brownfield Apple App" folder in "Brownfield Apple App (ExpoApp54)" target */, + 7A1B2C3D4E5F60718293A203 /* Exceptions for "Brownfield Apple App" folder in "Brownfield Apple App (ExpoAppBeta)" target */, + ); path = "Brownfield Apple App"; sourceTree = ""; }; @@ -193,6 +306,31 @@ ); 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; @@ -213,6 +351,17 @@ 6108E5322F40A26800EA8FA1 /* Frameworks */ = { isa = PBXGroup; children = ( + 61591FFB2FF3E43500BEFE92 /* libavif.xcframework */, + 61591FF42FF3E41C00BEFE92 /* SDWebImageAVIFCoder.xcframework */, + 61591FF22FF3E41C00BEFE92 /* SDWebImageSVGCoder.xcframework */, + 61591FF32FF3E41C00BEFE92 /* SDWebImageWebPCoder.xcframework */, + 61591FEF2FF3E3E200BEFE92 /* SDWebImage.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 */, @@ -239,6 +388,7 @@ 793C76A72EEBF938008A2A34 /* Brownfield Apple App (RNApp).app */, 79B8BE802FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54).app */, 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */, + 79B8BEB22FB8000000B94C6F /* Brownfield Apple App (ExpoApp56).app */, 7A1B2C3D4E5F60718293A202 /* Brownfield Apple App (ExpoAppBeta).app */, ); name = Products; @@ -316,6 +466,29 @@ productReference = 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */; productType = "com.apple.product-type.application"; }; + 79B8BEB42FB8000000B94C6F /* Brownfield Apple App (ExpoApp56) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 79B8BEB92FB8000000B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp56)" */; + 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 (ExpoAppBeta) */ = { isa = PBXNativeTarget; buildConfigurationList = 7A1B2C3D4E5F60718293A405 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoAppBeta)" */; @@ -352,6 +525,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,17 +542,19 @@ ); 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) */, + 79B8BE682FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54) */, + 79B8BE832FB7273600B94C6F /* Brownfield Apple App (ExpoApp55) */, + 79B8BEB42FB8000000B94C6F /* Brownfield Apple App (ExpoApp56) */, + 7A1B2C3D4E5F60718293A301 /* Brownfield Apple App (ExpoAppBeta) */, + ); }; /* End PBXProject section */ @@ -399,6 +580,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 79B8BEB02FB8000000B94C6F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 7A1B2C3D4E5F60718293A303 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -430,6 +618,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 79B8BEB12FB8000000B94C6F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 7A1B2C3D4E5F60718293A302 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1028,6 +1223,194 @@ }; name = "Release Vanilla"; }; + 79B8BEB52FB8000000B94C6F /* 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"; + }; + 79B8BEB62FB8000000B94C6F /* 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"; + }; + 79B8BEB72FB8000000B94C6F /* 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"; + }; + 79B8BEB82FB8000000B94C6F /* 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"; + }; 7A1B2C3D4E5F60718293A401 /* Debug Vanilla */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1475,6 +1858,17 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = "Release Expo"; }; + 79B8BEB92FB8000000B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp56)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 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)" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 56.xcscheme b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 56.xcscheme new file mode 100644 index 00000000..0db5f92f --- /dev/null +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo 56.xcscheme @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + 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..7c4a606b 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist @@ -14,6 +14,11 @@ orderHint 1 + Brownfield Apple App Expo 56.xcscheme + + orderHint + 0 + Brownfield Apple App Vanilla.xcscheme orderHint @@ -37,6 +42,11 @@ primary + 79B8BEB42FB8000000B94C6F + + primary + + 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..2f5968e2 100644 --- a/apps/AppleApp/package.json +++ b/apps/AppleApp/package.json @@ -4,7 +4,8 @@ "private": true, "type": "module", "scripts": { - "build:example:ios-consumer:expo": "yarn build:example:ios-consumer:expo55", + "build:example:ios-consumer:expo": "yarn build:example:ios-consumer:expo56", + "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:expo54": "node prepareXCFrameworks.js --appName ExpoApp54 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 54\" -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", @@ -14,8 +15,11 @@ "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/ExpoApp56/.gitignore b/apps/ExpoApp56/.gitignore new file mode 100644 index 00000000..4b00baf3 --- /dev/null +++ b/apps/ExpoApp56/.gitignore @@ -0,0 +1,43 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +web-build/ +expo-env.d.ts + +# Native +.kotlin/ +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo + +example + +# generated native folders +/ios +/android diff --git a/apps/ExpoApp56/BrownfieldStore.brownie.ts b/apps/ExpoApp56/BrownfieldStore.brownie.ts new file mode 100644 index 00000000..94e22c72 --- /dev/null +++ b/apps/ExpoApp56/BrownfieldStore.brownie.ts @@ -0,0 +1,21 @@ +import type { BrownieStore } from '@callstack/brownie'; + +export interface BrownfieldStore extends BrownieStore { + counter: number; + user: { + name: string; + }; +} + +export interface SettingsStore extends BrownieStore { + theme: 'light' | 'dark'; + notificationsEnabled: boolean; + privacyMode: boolean; +} + +declare module '@callstack/brownie' { + interface BrownieStores { + BrownfieldStore: BrownfieldStore; + SettingsStore: SettingsStore; + } +} diff --git a/apps/ExpoApp56/README.md b/apps/ExpoApp56/README.md new file mode 100644 index 00000000..4d67aec2 --- /dev/null +++ b/apps/ExpoApp56/README.md @@ -0,0 +1,56 @@ +# Welcome to your Expo app 👋 + +This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app). + +## Get started + +1. Install dependencies + + ```bash + npm install + ``` + +2. Start the app + + ```bash + npx expo start + ``` + +In the output, you'll find options to open the app in a + +- [development build](https://docs.expo.dev/develop/development-builds/introduction/) +- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/) +- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/) +- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo + +You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction). + +## Get a fresh project + +When you're ready, run: + +```bash +npm run reset-project +``` + +This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing. + +### Other setup steps + +- To set up ESLint for linting, run `npx expo lint`, or follow our guide on ["Using ESLint and Prettier"](https://docs.expo.dev/guides/using-eslint/) +- If you'd like to set up unit testing, follow our guide on ["Unit Testing with Jest"](https://docs.expo.dev/develop/unit-testing/) +- Learn more about the TypeScript setup in this template in our guide on ["Using TypeScript"](https://docs.expo.dev/guides/typescript/) + +## Learn more + +To learn more about developing your project with Expo, look at the following resources: + +- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides). +- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web. + +## Join the community + +Join our community of developers creating universal apps. + +- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute. +- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions. diff --git a/apps/ExpoApp56/RNApp.tsx b/apps/ExpoApp56/RNApp.tsx new file mode 100644 index 00000000..5e06ccc1 --- /dev/null +++ b/apps/ExpoApp56/RNApp.tsx @@ -0,0 +1,77 @@ +import { SafeAreaView } from 'react-native-safe-area-context'; +import { Button, StyleSheet, Text, View } from 'react-native'; +import BrownfieldNavigation from '@callstack/brownfield-navigation'; +import { checkAndFetchUpdate } from './src/utils/expo-rn-updates'; + +import Counter from './src/components/counter'; + +type RNAppProps = { + nativeOsVersionLabel?: string; +}; + +export default function RNApp({ nativeOsVersionLabel }: RNAppProps) { + return ( + + Expo React Native Brownfield + + {nativeOsVersionLabel ? ( + + {nativeOsVersionLabel} + + ) : null} + + + + +