You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
馃悰 After upgrading an Expo app to SDK 56, Expo config evaluation fails when using the react-native-ble-plx config plugin.聽#1339
I checked the documentation and FAQ without finding a solution
I checked to make sure that this issue has not already been filed
Expected Behavior
We upgrade to Expo SDK 56 and successfully run npx expo-doctor with no errors.
App builds successfully
Current Behavior
During Expo SDK 56 upgrade I discovered an issue with an import of expo/config-plugins.
While running expo-doctor command I receive an error: node_modules/expo/bin/cli config --json --full exited with non-zero code: 1
The plugin currently imports: from '@expo/config-plugins'
Expo SDK 56 recommends using the Expo sub-export instead: from("expo/config-plugins")
Adding @expo/config-plugins directly to the app (devDependencies) works around the crash, but expo-doctor warns that this package should not be installed directly.
Library version
3.5.1
Device
N/A
Environment info
N/A
Steps to reproduce
Upgrade to latest expo SDK with npx expo install expo@^56.0.0 --fix
Run npx expo-doctor
You are presented with an error described in the "Current Behavior" section.
I confirmed the package imports @expo/config-plugins without declaring it, which makes published plugin resolution depend on hoisting. Expo now explicitly recommends importing third-party library plugins through expo/config-plugins so the app Expo version supplies the compatible implementation and pnpm/Yarn PnP can resolve it.
I will add an isolated plugin-load regression with no direct @expo/config-plugins package, switch all plugin/runtime test imports to the Expo re-export, declare Expo as an optional peer, and verify the plugin against SDK 56 plus the existing package gates.
Implemented in #1341. All config-plugin imports now go through expo/config-plugins, Expo is declared as an optional peer, and the new resolution regression is part of CI.
I verified the packed package in a Node 20 / pnpm 10 strict consumer with expo@56.0.20 and no direct app dependency on @expo/config-plugins. The exact expo config --json --full path from the report exits successfully and the plugin emits BLUETOOTH, BLUETOOTH_ADMIN, and BLUETOOTH_CONNECT permissions. Repository plugin tests, lint, typecheck, plugin build, and Bob prepack also pass.
Activity
huytdps13400 commentedon Aug 26, 2026
/claim
I confirmed the package imports @expo/config-plugins without declaring it, which makes published plugin resolution depend on hoisting. Expo now explicitly recommends importing third-party library plugins through expo/config-plugins so the app Expo version supplies the compatible implementation and pnpm/Yarn PnP can resolve it.
I will add an isolated plugin-load regression with no direct @expo/config-plugins package, switch all plugin/runtime test imports to the Expo re-export, declare Expo as an optional peer, and verify the plugin against SDK 56 plus the existing package gates.
huytdps13400 commentedon Aug 26, 2026
Implemented in #1341. All config-plugin imports now go through expo/config-plugins, Expo is declared as an optional peer, and the new resolution regression is part of CI.
I verified the packed package in a Node 20 / pnpm 10 strict consumer with expo@56.0.20 and no direct app dependency on @expo/config-plugins. The exact expo config --json --full path from the report exits successfully and the plugin emits BLUETOOTH, BLUETOOTH_ADMIN, and BLUETOOTH_CONNECT permissions. Repository plugin tests, lint, typecheck, plugin build, and Bob prepack also pass.