diff --git a/.changeset/expo_avoid_web_browser_static_require.md b/.changeset/expo_avoid_web_browser_static_require.md new file mode 100644 index 00000000000..4b8fb1125e3 --- /dev/null +++ b/.changeset/expo_avoid_web_browser_static_require.md @@ -0,0 +1,7 @@ +--- +'@clerk/clerk-expo': patch +--- + +Stop statically resolving `expo-web-browser` in native bundles. `ClerkProvider` previously called `require('expo-web-browser')` synchronously inside an `isWeb()` runtime gate, but Metro's static analyzer resolved the literal-string require regardless of the gate, causing production bundling to fail for native consumers who don't install `expo-web-browser` (an optional peer dependency). + +The web-only call to `WebBrowser.maybeCompleteAuthSession()` has been moved into a platform-split helper (`maybeCompleteAuthSession.web.ts` for web, no-op `maybeCompleteAuthSession.ts` for native). Behavior on web is unchanged; native bundles no longer reference `expo-web-browser`. diff --git a/packages/expo/src/provider/ClerkProvider.tsx b/packages/expo/src/provider/ClerkProvider.tsx index d096cea4724..3c683be6c26 100644 --- a/packages/expo/src/provider/ClerkProvider.tsx +++ b/packages/expo/src/provider/ClerkProvider.tsx @@ -12,6 +12,7 @@ import { useNativeAuthEvents } from '../hooks/useNativeAuthEvents'; import NativeClerkModule from '../specs/NativeClerkModule'; import { tokenCache as defaultTokenCache } from '../token-cache'; import { isNative, isWeb } from '../utils/runtime'; +import { maybeCompleteAuthSession } from './maybeCompleteAuthSession'; import { getClerkInstance } from './singleton'; import type { BuildClerkOptions } from './singleton/types'; @@ -371,18 +372,12 @@ export function ClerkProvider(props: ClerkProviderProps