Skip to content

feat: support Expo 55#248

Merged
artus9033 merged 30 commits intomainfrom
feat/support-expo-55
Mar 13, 2026
Merged

feat: support Expo 55#248
artus9033 merged 30 commits intomainfrom
feat/support-expo-55

Conversation

@artus9033
Copy link
Collaborator

@artus9033 artus9033 commented Feb 23, 2026

Summary

This PR brings support for Expo 55 in the expo config plugin.
The entrypoint is updated: config plugin will now inflate a different file during CNG for pre-55 and post-55 Expo.
The internal infra of the repository is updated to run a matrix: both Expo demo apps for SDKs 54 & 55.

The build and internals of the ReactBrownfield target in iOS have been adapted to support SDK 55+ and pre-55 at once: because Expo's internals have changed (removed methods, moved methods to different classes), the version-specific implementation is switched using conditional compilation based on the EXPO_SDK_GTE_55 define; this define is configured using a config-plugin-injected piece of code to the app's Podfile.

The config plugin & docs are updated to properly handle (and inform of) Hermes artifact groupId, artifactId & version listing - RN 0.83+ has changed Hermes artifactId.
CI has been updated appropriately.

Test plan

CI green

@artus9033 artus9033 self-assigned this Feb 23, 2026
@artus9033 artus9033 changed the title feat: support expo 55 feat: support Expo 55 Feb 23, 2026
@artus9033 artus9033 marked this pull request as ready for review March 12, 2026 22:37
Copilot AI review requested due to automatic review settings March 12, 2026 22:37
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the @callstack/react-native-brownfield Expo config plugin and demo apps to support Expo SDK 55 while keeping compatibility with Expo SDK <55, including updated CI road tests and Android Hermes dependency handling.

Changes:

  • Add Expo SDK detection and split Android host templates for pre-55 vs post-55 Expo (CNG template inflation changes).
  • Update Android Hermes dependency resolution (new artifact coordinates logic + tests) and adjust templates/docs accordingly.
  • Add/rename Expo demo apps for SDK 54 and 55 and extend CI to road-test both versions.

Reviewed changes

Copilot reviewed 67 out of 132 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
packages/react-native-brownfield/vitest.config.ts Adds Vitest configuration for plugin unit tests.
packages/react-native-brownfield/src/expo-config-plugin/template/android/build.gradle.kts Switches Hermes dependency to a templated artifact coordinate.
packages/react-native-brownfield/src/expo-config-plugin/template/android/ReactNativeHostManager.pre55.kt Adds pre-Expo-55 Android host manager template.
packages/react-native-brownfield/src/expo-config-plugin/template/android/ReactNativeHostManager.post55.kt Adds Expo-55+ Android host manager template.
packages/react-native-brownfield/src/expo-config-plugin/ios/withBrownfieldIos.ts Uses centralized Expo SDK detection for iOS plugin behavior.
packages/react-native-brownfield/src/expo-config-plugin/ios/podfileHelpers.ts Adds Podfile logic to inject EXPO_SDK_GTE_55 Swift define for Expo 55+.
packages/react-native-brownfield/src/expo-config-plugin/expoUtils.ts Introduces shared Expo SDK info helper.
packages/react-native-brownfield/src/expo-config-plugin/android/withBrownfieldAndroid.ts Adjusts Android plugin imports to new utils location.
packages/react-native-brownfield/src/expo-config-plugin/android/withAndroidModuleFiles.ts Selects correct Android host template based on Expo SDK; injects Hermes artifact template var.
packages/react-native-brownfield/src/expo-config-plugin/android/utils/hermes.ts Adds RN-version-based Hermes artifact resolver.
packages/react-native-brownfield/src/expo-config-plugin/android/utils/gradleHelpers.ts Fixes Logger import path after utils refactor.
packages/react-native-brownfield/src/expo-config-plugin/android/utils/constants.ts Centralizes Brownfield Gradle plugin version/dependency string.
packages/react-native-brownfield/src/expo-config-plugin/android/utils/tests/hermes.test.ts Adds unit tests for Hermes artifact resolution.
packages/react-native-brownfield/src/expo-config-plugin/android/index.ts Updates public exports to new gradle helpers path.
packages/react-native-brownfield/package.json Adds Vitest + coverage deps and a test script.
packages/react-native-brownfield/ios/ExpoHostRuntime.swift Gates Expo SDK 55 API differences behind EXPO_SDK_GTE_55.
gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/expo/ExpoPublishingHelper.kt Minor log message formatting tweak.
docs/docs/docs/getting-started/examples.mdx Updates docs to describe Expo 54/55 demo apps and the new define behavior.
docs/docs/docs/getting-started/android.mdx Updates Hermes artifact guidance for newer RN versions.
apps/scripts/prepare-android-build-gradle-for-ci.ts Requires explicit project directory name to patch for CI.
apps/README.md Updates demos listing for Expo 54/55 split and notes.
apps/ExpoApp55/tsconfig.json Adds TS config for the Expo 55 demo app.
apps/ExpoApp55/src/hooks/use-theme.ts Adds theme hook for Expo 55 demo UI.
apps/ExpoApp55/src/hooks/use-color-scheme.web.ts Adds web-specific color scheme hydration logic.
apps/ExpoApp55/src/hooks/use-color-scheme.ts Re-exports RN color scheme hook.
apps/ExpoApp55/src/global.css Adds web CSS variables used by the demo.
apps/ExpoApp55/src/constants/theme.ts Defines theme tokens for Expo 55 demo UI.
apps/ExpoApp55/src/components/web-badge.tsx Adds Expo version badge component for web.
apps/ExpoApp55/src/components/ui/collapsible.tsx Adds collapsible UI component for demo app.
apps/ExpoApp55/src/components/themed-view.tsx Adds themed view wrapper.
apps/ExpoApp55/src/components/themed-text.tsx Adds themed text variants.
apps/ExpoApp55/src/components/postMessage/MessageBubble.tsx Adds message UI for postMessage demo.
apps/ExpoApp55/src/components/postMessage/Message.ts Adds message type for postMessage demo.
apps/ExpoApp55/src/components/hint-row.tsx Adds hint row UI component.
apps/ExpoApp55/src/components/external-link.tsx Adds external link component for demo.
apps/ExpoApp55/src/components/app-tabs.web.tsx Adds web tabs implementation for demo.
apps/ExpoApp55/src/components/app-tabs.tsx Adds native tabs implementation for demo.
apps/ExpoApp55/src/components/animated-icon.web.tsx Adds animated icon implementation for web.
apps/ExpoApp55/src/components/animated-icon.tsx Adds animated icon implementation for native.
apps/ExpoApp55/src/components/animated-icon.module.css Adds CSS module for web animated icon background.
apps/ExpoApp55/src/app/postMessage.tsx Adds postMessage screen for Expo 55 demo.
apps/ExpoApp55/src/app/index.tsx Adds home screen for Expo 55 demo.
apps/ExpoApp55/src/app/explore.tsx Adds explore screen for Expo 55 demo.
apps/ExpoApp55/src/app/_layout.tsx Adds app layout for Expo 55 demo routing.
apps/ExpoApp55/package.json Adds Expo 55 demo app package and scripts.
apps/ExpoApp55/eslint.config.js Adds ESLint flat config for Expo 55 demo.
apps/ExpoApp55/entry.tsx Adds entry wiring for Expo Router + Brownfield demo.
apps/ExpoApp55/assets/images/tabIcons/home@3x.png Adds Expo 55 demo tab icon asset.
apps/ExpoApp55/assets/images/tabIcons/home@2x.png Adds Expo 55 demo tab icon asset.
apps/ExpoApp55/assets/images/tabIcons/home.png Adds Expo 55 demo tab icon asset.
apps/ExpoApp55/assets/images/tabIcons/explore@3x.png Adds Expo 55 demo tab icon asset.
apps/ExpoApp55/assets/images/tabIcons/explore@2x.png Adds Expo 55 demo tab icon asset.
apps/ExpoApp55/assets/images/tabIcons/explore.png Adds Expo 55 demo tab icon asset.
apps/ExpoApp55/assets/images/splash-icon.png Adds Expo 55 demo splash asset.
apps/ExpoApp55/assets/images/react-logo@2x.png Adds Expo 55 demo image asset.
apps/ExpoApp55/assets/images/react-logo.png Adds Expo 55 demo image asset.
apps/ExpoApp55/assets/images/favicon.png Adds Expo 55 demo web favicon.
apps/ExpoApp55/assets/images/expo-logo.png Adds Expo 55 demo image asset.
apps/ExpoApp55/assets/images/expo-badge.png Adds Expo 55 demo image asset.
apps/ExpoApp55/assets/images/expo-badge-white.png Adds Expo 55 demo image asset.
apps/ExpoApp55/assets/images/android-icon-monochrome.png Adds Expo 55 demo adaptive icon asset.
apps/ExpoApp55/assets/expo.icon/icon.json Adds Expo 55 demo iOS icon configuration.
apps/ExpoApp55/app.json Adds Expo 55 demo Expo config (plugins, ids, etc.).
apps/ExpoApp55/RNApp.tsx Adds RNApp wrapper for Expo 55 demo project integration.
apps/ExpoApp55/README.md Adds default README for Expo 55 demo app.
apps/ExpoApp55/BrownfieldStore.brownie.ts Adds demo Brownie store typing for Expo 55 demo.
apps/ExpoApp55/.gitignore Adds Expo 55 demo gitignore.
apps/ExpoApp54/tsconfig.json Adds TS config for Expo 54 demo app.
apps/ExpoApp54/package.json Renames package to Expo 54 specific name and updates CI script invocation.
apps/ExpoApp54/hooks/use-theme-color.ts Adds theme-color hook for Expo 54 demo.
apps/ExpoApp54/hooks/use-color-scheme.web.ts Adds web-specific color scheme hydration logic (Expo 54 demo).
apps/ExpoApp54/hooks/use-color-scheme.ts Re-exports RN color scheme hook (Expo 54 demo).
apps/ExpoApp54/eslint.config.mjs Adds ESLint config for Expo 54 demo.
apps/ExpoApp54/entry.tsx Adds entry wiring for Expo 54 demo.
apps/ExpoApp54/constants/theme.ts Adds theme constants for Expo 54 demo.
apps/ExpoApp54/components/ui/icon-symbol.tsx Adds cross-platform icon mapping for Expo 54 demo.
apps/ExpoApp54/components/ui/icon-symbol.ios.tsx Adds iOS SF Symbols implementation for Expo 54 demo.
apps/ExpoApp54/components/ui/collapsible.tsx Adds collapsible UI component for Expo 54 demo.
apps/ExpoApp54/components/themed-view.tsx Adds themed view wrapper for Expo 54 demo.
apps/ExpoApp54/components/themed-text.tsx Adds themed text variants for Expo 54 demo.
apps/ExpoApp54/components/postMessage/MessageBubble.tsx Adds postMessage UI for Expo 54 demo.
apps/ExpoApp54/components/postMessage/Message.ts Adds message type for Expo 54 demo.
apps/ExpoApp54/components/parallax-scroll-view.tsx Adds parallax scroll view used by Expo 54 demo.
apps/ExpoApp54/components/hello-wave.tsx Adds animated hello wave component.
apps/ExpoApp54/components/haptic-tab.tsx Adds haptic tab button component for iOS.
apps/ExpoApp54/components/external-link.tsx Adds external link component for Expo 54 demo.
apps/ExpoApp54/components/counter/index.tsx Adds placeholder counter component (non-iOS).
apps/ExpoApp54/components/counter/index.ios.tsx Adds iOS-specific counter using Brownie store.
apps/ExpoApp54/assets/images/react-logo.png Adds Expo 54 demo image asset.
apps/ExpoApp54/assets/images/favicon.png Adds Expo 54 demo favicon.
apps/ExpoApp54/assets/images/android-icon-monochrome.png Adds Expo 54 demo adaptive icon asset.
apps/ExpoApp54/assets/images/partial-react-logo.png Adds Expo 54 demo image asset.
apps/ExpoApp54/app/modal.tsx Adds modal screen for Expo 54 demo routing.
apps/ExpoApp54/app/_layout.tsx Adds root layout for Expo 54 demo routing.
apps/ExpoApp54/app/(tabs)/postMessage.tsx Adds postMessage tab for Expo 54 demo.
apps/ExpoApp54/app/(tabs)/index.tsx Updates home screen title to explicitly reference Expo 54.
apps/ExpoApp54/app/(tabs)/explore.tsx Adds explore tab for Expo 54 demo.
apps/ExpoApp54/app/(tabs)/_layout.tsx Adds tabs layout for Expo 54 demo.
apps/ExpoApp54/app.json Renames Expo config name/slug/bundle ids for Expo 54 demo.
apps/ExpoApp54/RNApp.tsx Adds RNApp wrapper for Expo 54 demo project integration.
apps/ExpoApp54/README.md Adds default README for Expo 54 demo app.
apps/ExpoApp54/BrownfieldStore.brownie.ts Adds demo Brownie store typing for Expo 54 demo.
apps/ExpoApp54/.gitignore Adds Expo 54 demo gitignore.
apps/AppleApp/package.json Splits Expo consumer build scripts to expo54/expo55.
apps/AndroidApp/package.json Adds Expo 54/55 build scripts and keeps a default expo alias.
apps/AndroidApp/gradle/libs.versions.toml Adds separate Maven coordinates for expo54/expo55 artifacts; bumps Kotlin version.
apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt Adds Expo 55 host manager typealias.
apps/AndroidApp/app/src/expo55/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt Adds Expo 55 constants (labeling).
apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeHostManager.kt Updates Expo 54 host manager typealias to versioned package.
apps/AndroidApp/app/src/expo54/java/com/callstack/brownfield/android/expo/ReactNativeConstants.kt Updates Expo 54 display name constant.
apps/AndroidApp/app/build.gradle.kts Splits product flavors into expo54 and expo55 and wires deps accordingly.
.yarnrc.yml Minor formatting/ordering update.
.github/workflows/ci.yml Adds matrixed Android road tests for Expo 54 and Expo 55.
.github/actions/appleapp-road-test/action.yml Adjusts Apple road-test build command mapping for Expo variants.
.github/actions/androidapp-road-test/action.yml Updates action to treat expo<version> flavors as Expo builds.
.changeset/wet-ears-cough.md Adds changeset for Expo 55 support release.
.changeset/config.json Updates changeset config to include new Expo demo packages.
Comments suppressed due to low confidence (1)

apps/README.md:18

  • Typo: "bost" should be "both".

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

@artus9033 artus9033 force-pushed the feat/support-expo-55 branch from 3aea0ab to 0cc2f91 Compare March 13, 2026 09:23
@artus9033 artus9033 requested review from hurali97 and thymikee March 13, 2026 10:07
Copy link
Member

@hurali97 hurali97 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good ✅

@artus9033 artus9033 merged commit b0a6f41 into main Mar 13, 2026
9 checks passed
@artus9033 artus9033 deleted the feat/support-expo-55 branch March 13, 2026 10:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants