Skip to content

feat: create expo config plugin#2

Open
MalcolmTomisin wants to merge 4 commits into
mainfrom
create-expo-config-plugin
Open

feat: create expo config plugin#2
MalcolmTomisin wants to merge 4 commits into
mainfrom
create-expo-config-plugin

Conversation

@MalcolmTomisin

Copy link
Copy Markdown
Contributor

Added an expo config plugin to reduce set up steps on Expo

MalcolmTomisin and others added 4 commits June 26, 2026 15:43
Replaces the manual app.json edits and AppDelegate snippet copy-paste with
a first-party Expo config plugin. Consumers pass `iosClientId` once and
the plugin handles the reversed Client ID injection into
CFBundleURLSchemes and the application(_:open:options:) URL forwarder
during prebuild.

`@expo/config-plugins` is declared as an optional peer dependency so
bare React Native CLI users don't install Expo tooling they won't use.

Supports both Swift and Objective-C AppDelegates. Idempotent via a
marker comment.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace the hand-rolled `ios.infoPlist.CFBundleURLTypes` block in
example/app.json with a plugin entry that derives the reversed iOS
Client ID at prebuild time. Demonstrates the canonical Expo pattern
and removes the brittle "remember to update the placeholder when the
client ID changes" footgun.

Declare the library as a workspace dependency so Expo's plugin
resolver can locate it in example/node_modules.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- README: add "Using Expo?" callout at the top of iOS Setup pointing
  bare-RN users to the manual steps below, and a new "Expo config
  plugin" section covering install, app.config entry, props table,
  and the Expo Go incompatibility note.
- CONTRIBUTING: add `yarn build:plugin` to the script reference and
  document the plugin test suite location.
- ROADMAP: check off Phase 6 (Expo Support) items now that the plugin,
  example coverage, and docs are all shipped.

The existing manual iOS setup snippets stay verbatim — bare React
Native CLI users see one extra callout and skip it; their setup
section is unchanged.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
`withInfoPlist` and `withAppDelegate` pass the modified config to their
callback as the same parameter name (`config`) that the outer
`ConfigPlugin` already binds. Rename the inner parameter to `mod`
(matching its `modResults` field) so the no-shadow lint rule passes
without disabling it.

Also exclude `plugin/build/` from eslint so the compiled CommonJS
output doesn't get linted as TypeScript source — same pattern we
already use for `lib/`.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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.

1 participant