From cd0acee697e57a795ce9f35f77dd1773e82efc84 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Thu, 25 Jun 2026 17:12:42 -0700 Subject: [PATCH 1/2] feat(expo): Move Google Sign to a new package --- .changeset/expo-google-signin-package.md | 8 + .github/workflows/expo-native-build.yml | 79 +- integration/templates/expo-native/App.tsx | 3 + integration/templates/expo-native/app.json | 2 +- .../expo-google-signin/android/build.gradle | 39 + .../android/src/main/AndroidManifest.xml | 1 + .../googlesignin/ClerkGoogleSignInModule.kt | 0 packages/expo-google-signin/app.plugin.d.ts | 5 + packages/expo-google-signin/app.plugin.js | 32 + .../expo-module.config.json | 9 + .../ios/ClerkGoogleSignIn.podspec | 0 .../ios/ClerkGoogleSignInModule.swift | 0 packages/expo-google-signin/package.json | 73 ++ .../__tests__/useSignInWithGoogle.test.ts | 33 +- packages/expo-google-signin/src/global.d.ts | 1 + .../google-one-tap/ClerkGoogleOneTapSignIn.ts | 2 +- .../src/google-one-tap/index.ts | 0 .../src/google-one-tap/types.ts | 0 packages/expo-google-signin/src/index.ts | 5 + .../specs/NativeClerkGoogleSignIn.android.ts | 0 .../src/specs/NativeClerkGoogleSignIn.ts | 0 .../src}/useSignInWithGoogle.android.ts | 5 +- .../src}/useSignInWithGoogle.ios.ts | 5 +- .../src}/useSignInWithGoogle.shared.ts | 22 +- .../src}/useSignInWithGoogle.ts | 6 +- .../src}/useSignInWithGoogle.types.ts | 2 + .../tsconfig.declarations.json | 14 + packages/expo-google-signin/tsconfig.json | 27 + packages/expo-google-signin/tsup.config.ts | 30 + packages/expo-google-signin/vitest.config.mts | 10 + packages/expo-google-signin/vitest.setup.mts | 18 + packages/expo/android/build.gradle | 7 - packages/expo/app.plugin.js | 34 - packages/expo/expo-module.config.json | 11 +- packages/expo/package.json | 5 + packages/expo/src/google/index.ts | 4 +- packages/expo/src/plugin/withClerkExpo.ts | 43 +- packages/expo/src/types/index.ts | 21 - pnpm-lock.yaml | 997 ++++++++++++++++-- 39 files changed, 1268 insertions(+), 285 deletions(-) create mode 100644 .changeset/expo-google-signin-package.md create mode 100644 packages/expo-google-signin/android/build.gradle create mode 100644 packages/expo-google-signin/android/src/main/AndroidManifest.xml rename packages/{expo => expo-google-signin}/android/src/main/java/expo/modules/clerk/googlesignin/ClerkGoogleSignInModule.kt (100%) create mode 100644 packages/expo-google-signin/app.plugin.d.ts create mode 100644 packages/expo-google-signin/app.plugin.js create mode 100644 packages/expo-google-signin/expo-module.config.json rename packages/{expo => expo-google-signin}/ios/ClerkGoogleSignIn.podspec (100%) rename packages/{expo => expo-google-signin}/ios/ClerkGoogleSignInModule.swift (100%) create mode 100644 packages/expo-google-signin/package.json rename packages/{expo/src/hooks => expo-google-signin/src}/__tests__/useSignInWithGoogle.test.ts (89%) create mode 100644 packages/expo-google-signin/src/global.d.ts rename packages/{expo => expo-google-signin}/src/google-one-tap/ClerkGoogleOneTapSignIn.ts (97%) rename packages/{expo => expo-google-signin}/src/google-one-tap/index.ts (100%) rename packages/{expo => expo-google-signin}/src/google-one-tap/types.ts (100%) create mode 100644 packages/expo-google-signin/src/index.ts rename packages/{expo => expo-google-signin}/src/specs/NativeClerkGoogleSignIn.android.ts (100%) rename packages/{expo => expo-google-signin}/src/specs/NativeClerkGoogleSignIn.ts (100%) rename packages/{expo/src/hooks => expo-google-signin/src}/useSignInWithGoogle.android.ts (89%) rename packages/{expo/src/hooks => expo-google-signin/src}/useSignInWithGoogle.ios.ts (89%) rename packages/{expo/src/hooks => expo-google-signin/src}/useSignInWithGoogle.shared.ts (91%) rename packages/{expo/src/hooks => expo-google-signin/src}/useSignInWithGoogle.ts (92%) rename packages/{expo/src/hooks => expo-google-signin/src}/useSignInWithGoogle.types.ts (86%) create mode 100644 packages/expo-google-signin/tsconfig.declarations.json create mode 100644 packages/expo-google-signin/tsconfig.json create mode 100644 packages/expo-google-signin/tsup.config.ts create mode 100644 packages/expo-google-signin/vitest.config.mts create mode 100644 packages/expo-google-signin/vitest.setup.mts diff --git a/.changeset/expo-google-signin-package.md b/.changeset/expo-google-signin-package.md new file mode 100644 index 00000000000..e15924cafdd --- /dev/null +++ b/.changeset/expo-google-signin-package.md @@ -0,0 +1,8 @@ +--- +'@clerk/expo': major +'@clerk/expo-google-signin': minor +--- + +Move native Google Sign-In out of `@clerk/expo` and into `@clerk/expo-google-signin`. + +Apps using native Google Sign-In should install `@clerk/expo-google-signin`, add it to the Expo config plugin list alongside `@clerk/expo`, and rebuild their native app. The `@clerk/expo/google` import path continues to re-export `useSignInWithGoogle`. diff --git a/.github/workflows/expo-native-build.yml b/.github/workflows/expo-native-build.yml index c65284a4963..1ff350b33b8 100644 --- a/.github/workflows/expo-native-build.yml +++ b/.github/workflows/expo-native-build.yml @@ -9,6 +9,7 @@ on: - '.github/workflows/expo-native-build.yml' - 'integration/templates/expo-native/**' - 'packages/expo/**' + - 'packages/expo-google-signin/**' workflow_dispatch: permissions: @@ -67,16 +68,23 @@ jobs: - name: Install monorepo dependencies run: pnpm install --frozen-lockfile - - name: Build and pack @clerk/expo + - name: Build and pack Clerk Expo packages run: | pnpm --filter @clerk/expo... build + pnpm --filter @clerk/expo-google-signin... build mkdir -p "$SDK_PACK_DIR" pnpm --filter @clerk/expo pack --pack-destination "$SDK_PACK_DIR" - SDK_TARBALL="$(ls "$SDK_PACK_DIR"/clerk-expo-*.tgz)" - if tar -tf "$SDK_TARBALL" | grep -q '^package/e2e/'; then + pnpm --filter @clerk/expo-google-signin pack --pack-destination "$SDK_PACK_DIR" + EXPO_TARBALL="$(ls "$SDK_PACK_DIR"/clerk-expo-[0-9]*.tgz)" + GOOGLE_TARBALL="$(ls "$SDK_PACK_DIR"/clerk-expo-google-signin-*.tgz)" + if tar -tf "$EXPO_TARBALL" | grep -q '^package/e2e/'; then echo "Fixture files must not be packed into @clerk/expo" exit 1 fi + if tar -tf "$GOOGLE_TARBALL" | grep -q '^package/e2e/'; then + echo "Fixture files must not be packed into @clerk/expo-google-signin" + exit 1 + fi - name: Install fixture dependencies working-directory: ${{ env.FIXTURE_DIR }} @@ -85,8 +93,9 @@ jobs: run: | cp "package.sdk-$EXPO_SDK.json" package.json pnpm install --no-frozen-lockfile - SDK_TARBALL="$(ls "$SDK_PACK_DIR"/clerk-expo-*.tgz)" - pnpm add "$SDK_TARBALL" -w + EXPO_TARBALL="$(ls "$SDK_PACK_DIR"/clerk-expo-[0-9]*.tgz)" + GOOGLE_TARBALL="$(ls "$SDK_PACK_DIR"/clerk-expo-google-signin-*.tgz)" + pnpm add "$EXPO_TARBALL" "$GOOGLE_TARBALL" -w pnpm expo install expo-auth-session expo-constants expo-crypto expo-dev-client expo-secure-store expo-web-browser - name: Write fixture .env @@ -120,3 +129,63 @@ jobs: if: ${{ matrix.platform == 'ios' }} working-directory: ${{ env.FIXTURE_DIR }} run: pnpm build:ios + + core-only-prebuild: + if: ${{ github.head_ref != 'changeset-release/main' }} + name: Expo core-only autolinking smoke + runs-on: blacksmith-8vcpu-ubuntu-2204 + timeout-minutes: 20 + + steps: + - name: Checkout repo + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + persist-credentials: false + + - uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: 24.15.0 + cache: pnpm + + - name: Install monorepo dependencies + run: pnpm install --frozen-lockfile + + - name: Build and pack @clerk/expo + run: | + pnpm --filter @clerk/expo... build + mkdir -p "$SDK_PACK_DIR" + pnpm --filter @clerk/expo pack --pack-destination "$SDK_PACK_DIR" + + - name: Install core-only fixture dependencies + working-directory: ${{ env.FIXTURE_DIR }} + env: + EXPO_SDK: 56 + run: | + cp "package.sdk-$EXPO_SDK.json" package.json + pnpm install --no-frozen-lockfile + EXPO_TARBALL="$(ls "$SDK_PACK_DIR"/clerk-expo-[0-9]*.tgz)" + pnpm add "$EXPO_TARBALL" -w + pnpm expo install expo-auth-session expo-constants expo-dev-client expo-secure-store expo-web-browser + + - name: Write core-only app config + working-directory: ${{ env.FIXTURE_DIR }} + run: | + node - <<'NODE' + const fs = require('fs'); + const app = JSON.parse(fs.readFileSync('app.json', 'utf8')); + app.expo.plugins = ['expo-secure-store', '@clerk/expo', 'expo-web-browser']; + fs.writeFileSync('app.json', JSON.stringify(app, null, 2) + '\n'); + NODE + + - name: Prebuild Android core-only fixture + working-directory: ${{ env.FIXTURE_DIR }} + run: pnpm expo prebuild --clean --platform android + + - name: Assert Google native module is not autolinked + working-directory: ${{ env.FIXTURE_DIR }} + run: | + if grep -R "ClerkGoogleSignIn\|googleid\|credentials-play-services-auth" android; then + echo "Google Sign-In native code was autolinked in core-only fixture" + exit 1 + fi diff --git a/integration/templates/expo-native/App.tsx b/integration/templates/expo-native/App.tsx index 4d549077e3e..0114f94b8ff 100644 --- a/integration/templates/expo-native/App.tsx +++ b/integration/templates/expo-native/App.tsx @@ -1,4 +1,5 @@ import { ClerkProvider, useAuth, useUser } from '@clerk/expo'; +import { useSignInWithGoogle } from '@clerk/expo/google'; import { AuthView, UserButton } from '@clerk/expo/native'; import { tokenCache } from '@clerk/expo/token-cache'; import { useState } from 'react'; @@ -12,6 +13,7 @@ if (!publishableKey) { function NativeBuildFixture() { const { isLoaded, isSignedIn } = useAuth({ treatPendingAsSignedOut: false }); + const { startGoogleAuthenticationFlow } = useSignInWithGoogle(); const { user } = useUser(); const [isAuthOpen, setIsAuthOpen] = useState(false); @@ -23,6 +25,7 @@ function NativeBuildFixture() { {isLoaded ? `signed ${isSignedIn ? 'in' : 'out'}` : 'loading'} + {typeof startGoogleAuthenticationFlow} {user?.id && {user.id}}