Monorepo of community-maintained Expo config plugins for React Native libraries. Plugins auto-configure native Android/iOS projects during npx expo prebuild.
- Namespace:
@config-plugins/* - Package manager: pnpm with workspaces
- Publishing:
pnpm publish(independent versioning)
# Install dependencies
pnpm install
# Build all packages
pnpm prepare
# Watch build all packages
pnpm start
# Generate a new plugin
pnpm gen
# Run tests for a specific package
cd packages/<name> && pnpm test
# Lint a specific package
cd packages/<name> && pnpm lint --max-warnings 0
# Build a specific package
cd packages/<name> && pnpm build
# Clean a specific package
cd packages/<name> && pnpm clean
# Rebuild an example app to test config plugins
cd apps/<name> && pnpm expo prebuild --cleanpackages/— Config plugin packages (each hassrc/,__tests__/)apps/— Example apps for testing pluginsfixtures/— Shared test fixtures (native config files: AppDelegate, build.gradle, Podfile, etc.)scripts/— Repo tooling (plugin generator, dependabot config, issue templates)
- Use conventional commits (e.g.,
feat(react-native-foo): add bar) - Branch naming:
@your-github-username/type/description - Each package delegates build/test/lint to
expo-module-scripts - TypeScript source in
src/, compiled output inbuild/ - Shared dependency versions are defined in the
catalog:block inpnpm-workspace.yamland referenced withcatalog:in each package'spackage.json - Peer dependency on
expo@^56 - Tests use Jest with
memfsfor virtual filesystem testing
When a new Expo SDK is released (e.g., SDK 54 → SDK 55), every package and example app must be updated. Use conventional commits scoped to the package name (e.g., chore(react-native-foo): bump to expo@^55).
Update the catalog: block with the new SDK versions for shared dependencies:
expo— Update to^<NEW_SDK>(used aspeerDependenciesin all packages).expo-module-scripts— Update to^<NEW_SDK>.@expo/config-plugins— Update to^<NEW_SDK>.- Review other catalog entries (
@expo/image-utils,@expo/plist, etc.) and bump if needed.
For each package:
README.md— Add a new row to the version compatibility table with the new SDK version, the latest compatible upstream package version, and the next config plugin major version.- Build & test — Run
pnpm buildandpnpm test(if tests exist) to verify nothing broke.
For each example app:
package.json— Updateexpoto the new SDK version (e.g.,~54→~55).- Run
npx expo install --fixto align all other dependencies (react,react-native,expo-splash-screen, etc.) to compatible versions. - Remove any stale vendored templates or files (e.g., old
expo-template-bare-minimum-*.tgz).
scripts/generate-plugin.ts— UpdateSDK_VERSIONto the new SDK number.
- Run
pnpm installfrom the root to regeneratepnpm-lock.yaml. - Run
pnpm prepareto verify all packages build. - Run tests for packages that have them.
- Update
CLAUDE.mdif any conventions changed (e.g., the peer dependency version listed under Conventions).
Run these from the root:
pnpm update-dependabot-config
pnpm update-issue-template