Skip to content
Open
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
c9f3d62
feat(repo): Protect -> Show
jacekradko Dec 5, 2025
1f8e652
typing tweak
jacekradko Dec 5, 2025
880b5c8
Merge branch 'vincent-and-the-doctor' into feat/protect-refactor
jacekradko Dec 5, 2025
fe77607
wip
jacekradko Dec 5, 2025
e007eed
wip
jacekradko Dec 6, 2025
9ff6422
Merge branch 'vincent-and-the-doctor' into feat/protect-refactor
jacekradko Dec 8, 2025
3862af9
Merge branch 'vincent-and-the-doctor' into feat/protect-refactor
jacekradko Dec 8, 2025
11726bb
wip
jacekradko Dec 8, 2025
b632485
wip
jacekradko Dec 8, 2025
07a3f7d
wip
jacekradko Dec 8, 2025
75cc284
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 8, 2025
05b73ca
wip
jacekradko Dec 8, 2025
0f345b8
wip
jacekradko Dec 8, 2025
7c0b86c
better JSDoc
jacekradko Dec 8, 2025
c133f9a
wip
jacekradko Dec 8, 2025
0ec9b9c
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 9, 2025
f774e21
wip
jacekradko Dec 9, 2025
fdbb5cd
wip
jacekradko Dec 9, 2025
72fcf09
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 9, 2025
4a3a968
update codemod
jacekradko Dec 9, 2025
197ae2c
backfill codemod
jacekradko Dec 9, 2025
88f3e35
wip
jacekradko Dec 9, 2025
aba8aad
adjust JSDocs
jacekradko Dec 9, 2025
c9b1d2a
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 10, 2025
8db6d35
update app router template
jacekradko Dec 11, 2025
a603b43
wip
jacekradko Dec 11, 2025
671c0f1
changesets
jacekradko Dec 11, 2025
73637d8
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 11, 2025
3aacf7b
more removals
jacekradko Dec 11, 2025
6fc15a3
update codemods
jacekradko Dec 11, 2025
826a9cb
wip
jacekradko Dec 11, 2025
9121fbc
wip
jacekradko Dec 11, 2025
01afa55
fix vue tests
jacekradko Dec 12, 2025
5d6149b
wip
jacekradko Dec 12, 2025
4657f99
wip
jacekradko Dec 12, 2025
3bb1953
wip
jacekradko Dec 12, 2025
5ee8745
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 12, 2025
8c719cd
wip
jacekradko Dec 12, 2025
d768f6e
update changeset
jacekradko Dec 12, 2025
b064082
update astro SDK
jacekradko Dec 12, 2025
3014891
wip
jacekradko Dec 12, 2025
476451e
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 12, 2025
4c6b69d
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 12, 2025
8496c81
pr feedback
jacekradko Dec 13, 2025
4d73e5c
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 13, 2025
fe0a275
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 15, 2025
c9ce109
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 16, 2025
8d52c4b
remove obsolete components
jacekradko Dec 16, 2025
6081f07
fix types and add test
jacekradko Dec 17, 2025
9043fea
fix e2e templates
jacekradko Dec 17, 2025
37d9acd
improve codemod
jacekradko Dec 17, 2025
160d82c
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 17, 2025
72f3d07
Merge branch 'main' into feat/protect-refactor
jacekradko Dec 17, 2025
f045134
wip
jacekradko Dec 17, 2025
be35c47
wip
jacekradko Dec 17, 2025
68b9078
wip
jacekradko Dec 18, 2025
6229696
wip
jacekradko Dec 18, 2025
1349533
pr feedback
jacekradko Dec 18, 2025
485c353
wip
jacekradko Dec 18, 2025
5cda2cf
wip
jacekradko Dec 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/migrate-to-show.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@clerk/upgrade': minor
---

Add a `transform-protect-to-show` codemod that migrates client-side `<Protect>` usage to `<Show>` with automatic prop and import updates.
11 changes: 11 additions & 0 deletions .changeset/show-the-guards.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@clerk/react': major
'@clerk/nextjs': major
'@clerk/expo': major
'@clerk/chrome-extension': major
'@clerk/shared': minor
'@clerk/astro': patch
'@clerk/vue': patch
---

Restrict `<Protect>` to App Router server usage and introduce `<Show when={...}>` as the client-side authorization component, updating shared types and Astro/Vue wrappers to align with the new API.
12 changes: 6 additions & 6 deletions integration/templates/expo-web/app/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Text, View } from 'react-native';
import { SignedIn, SignedOut } from '@clerk/expo';
import { Show } from '@clerk/expo';
import { UserButton } from '@clerk/expo/web';
import { Text, View } from 'react-native';

export default function Index() {
return (
Expand All @@ -11,13 +11,13 @@ export default function Index() {
alignItems: 'center',
}}
>
<SignedIn>
<Show when='signedIn'>
<Text>You are signed in!</Text>
<UserButton />
</SignedIn>
<SignedOut>
</Show>
<Show when='signedOut'>
<Text>You are signed out</Text>
</SignedOut>
</Show>
</View>
);
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import { SignedIn, SignedOut, SignInButton, SignUpButton, UserButton } from '@clerk/nextjs';
import { Show, SignInButton, SignUpButton, UserButton } from '@clerk/nextjs';

export default function Home() {
return (
<header>
<SignedOut>
<Show when='signedOut'>
<p>signed-out-state</p>
<SignInButton />
<SignUpButton />
</SignedOut>
<SignedIn>
</Show>
<Show when='signedIn'>
<p>signed-in-state</p>
<UserButton />
</SignedIn>
</Show>
</header>
);
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import { SignedIn } from '@clerk/nextjs';
import { Show } from '@clerk/nextjs';
import { CheckoutButton } from '@clerk/nextjs/experimental';

export default function Home() {
return (
<main>
<SignedIn>
<Show when='signedIn'>
<CheckoutButton
planId='cplan_2wMjqdlza0hTJc4HLCoBwAiExhF'
planPeriod='month'
>
Checkout Now
</CheckoutButton>
</SignedIn>
</Show>
</main>
);
}
25 changes: 15 additions & 10 deletions integration/templates/next-app-router/src/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Protect, SignedIn, SignedOut, SignIn, UserButton } from '@clerk/nextjs';
import { Show, SignIn, UserButton } from '@clerk/nextjs';
import Link from 'next/link';
import { ClientId } from './client-id';

Expand All @@ -7,18 +7,23 @@ export default function Home() {
<main>
<UserButton fallback={<>Loading user button</>} />
<ClientId />
<SignedIn>SignedIn</SignedIn>
<SignedOut>SignedOut</SignedOut>
<Protect fallback={'SignedOut from protect'}>SignedIn from protect</Protect>
<Protect plan='free_user'>
<Show when='signedIn'>SignedIn</Show>
<Show when='signedOut'>SignedOut</Show>
<Show
fallback={'SignedOut from protect'}
when='signedIn'
>
SignedIn from protect
</Show>
<Show when={{ plan: 'free_user' }}>
<p>user in free</p>
</Protect>
<Protect plan='pro'>
</Show>
<Show when={{ plan: 'pro' }}>
<p>user in pro</p>
</Protect>
<Protect plan='plus'>
</Show>
<Show when={{ plan: 'plus' }}>
<p>user in plus</p>
</Protect>
</Show>
<SignIn
routing='hash'
signUpUrl={'/sign-up'}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { PricingTable, Protect } from '@clerk/nextjs';
import { PricingTable, Show } from '@clerk/nextjs';

export default async function PricingTablePage({
searchParams,
Expand All @@ -8,15 +8,15 @@ export default async function PricingTablePage({
const newSubscriptionRedirectUrl = (await searchParams).newSubscriptionRedirectUrl;
return (
<>
<Protect plan='free_user'>
<Show when={{ plan: 'free_user' }}>
<p>user in free</p>
</Protect>
<Protect plan='pro'>
</Show>
<Show when={{ plan: 'pro' }}>
<p>user in pro</p>
</Protect>
<Protect plan='plus'>
</Show>
<Show when={{ plan: 'plus' }}>
<p>user in plus</p>
</Protect>
</Show>
<PricingTable newSubscriptionRedirectUrl={newSubscriptionRedirectUrl} />
</>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
'use client';
import { Protect } from '@clerk/nextjs';
import { Show } from '@clerk/nextjs';

export default function Page() {
return (
<Protect
permission='org:posts:manage'
/* @ts-ignore Need to take a look at the TS files, might be a types/react version thing */
<Show
fallback={<p>User is missing permissions</p>}
when={{ permission: 'org:posts:manage' }}
>
<p>User has access</p>
</Protect>
</Show>
);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { Protect } from '@clerk/nextjs';
import { Show } from '@clerk/nextjs';

export default function Page() {
return (
<Protect
role='org:admin'
<Show
fallback={<p>User is not admin</p>}
when={{ role: 'org:admin' }}
>
<p>User has access</p>
</Protect>
</Show>
);
}
8 changes: 4 additions & 4 deletions integration/templates/react-cra/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
// @ts-ignore
import React from 'react';
import './App.css';
import { SignedIn, SignedOut, SignIn, UserButton } from '@clerk/react';
import { Show, SignIn, UserButton } from '@clerk/react';

function App() {
return (
<main>
<SignedOut>
<Show when='signedOut'>
<SignIn />
</SignedOut>
<SignedIn>Signed In</SignedIn>
</Show>
<Show when='signedIn'>Signed In</Show>
<UserButton />
</main>
);
Expand Down
10 changes: 5 additions & 5 deletions integration/templates/react-router-library/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { SignInButton, SignedIn, SignedOut, UserButton } from '@clerk/react-router';
import { Show, SignInButton, UserButton } from '@clerk/react-router';
import './App.css';

function App() {
return (
<header>
<SignedOut>
<Show when='signedOut'>
<SignInButton />
</SignedOut>
<SignedIn>
</Show>
<Show when='signedIn'>
<UserButton />
</SignedIn>
</Show>
</header>
);
}
Expand Down
6 changes: 3 additions & 3 deletions integration/templates/react-router-node/app/routes/home.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SignedIn, SignedOut, UserButton } from '@clerk/react-router';
import { Show, UserButton } from '@clerk/react-router';
import type { Route } from './+types/home';

export function meta({}: Route.MetaArgs) {
Expand All @@ -9,8 +9,8 @@ export default function Home() {
return (
<div>
<UserButton />
<SignedIn>SignedIn</SignedIn>
<SignedOut>SignedOut</SignedOut>
<Show when='signedIn'>SignedIn</Show>
<Show when='signedOut'>SignedOut</Show>
</div>
);
}
6 changes: 3 additions & 3 deletions integration/templates/react-vite/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { OrganizationSwitcher, SignedIn, SignedOut, UserButton } from '@clerk/react';
import { OrganizationSwitcher, Show, UserButton } from '@clerk/react';
import { Link } from 'react-router-dom';
import React from 'react';
import { ClientId } from './client-id';
Expand All @@ -9,8 +9,8 @@ function App() {
<UserButton />
<OrganizationSwitcher fallback={<>Loading organization switcher</>} />
<ClientId />
<SignedOut>SignedOut</SignedOut>
<SignedIn>SignedIn</SignedIn>
<Show when='signedOut'>SignedOut</Show>
<Show when='signedIn'>SignedIn</Show>
<Link href='/protected'>Protected</Link>
</main>
);
Expand Down
6 changes: 3 additions & 3 deletions integration/templates/react-vite/src/protected/index.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { SignedIn } from '@clerk/react';
import { Show } from '@clerk/react';

export default function Page() {
return (
<div>
<SignedIn>
<Show when='signedIn'>
<div data-testid='protected'>Protected</div>
</SignedIn>
</Show>
</div>
);
}
10 changes: 5 additions & 5 deletions integration/templates/tanstack-react-start/src/routes/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SignedIn, UserButton, SignOutButton, SignedOut, SignIn } from '@clerk/tanstack-react-start';
import { Show, SignIn, SignOutButton, UserButton } from '@clerk/tanstack-react-start';
import { createFileRoute } from '@tanstack/react-router';

export const Route = createFileRoute('/')({
Expand All @@ -9,7 +9,7 @@ function Home() {
return (
<div>
<h1>Index Route</h1>
<SignedIn>
<Show when='signedIn'>
<p>You are signed in!</p>
<div>
<p>View your profile here</p>
Expand All @@ -18,12 +18,12 @@ function Home() {
<div>
<SignOutButton />
</div>
</SignedIn>
<SignedOut>
</Show>
<Show when='signedOut'>
<p>You are signed out</p>

<SignIn />
</SignedOut>
</Show>
</div>
);
}
10 changes: 5 additions & 5 deletions integration/templates/vue-vite/src/App.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { SignedIn, SignedOut, ClerkLoaded, ClerkLoading } from '@clerk/vue';
import { ClerkLoaded, ClerkLoading, Show } from '@clerk/vue';
import CustomUserButton from './components/CustomUserButton.vue';
import LanguagePicker from './components/LanguagePicker.vue';
</script>
Expand All @@ -11,12 +11,12 @@ import LanguagePicker from './components/LanguagePicker.vue';
<p class="title">Vue Clerk Integration test</p>
</div>
<LanguagePicker />
<SignedIn>
<Show when="signedIn">
<CustomUserButton />
</SignedIn>
<SignedOut>
</Show>
<Show when="signedOut">
<RouterLink to="/sign-in">Sign in</RouterLink>
</SignedOut>
</Show>
</div>
</header>
<main>
Expand Down
6 changes: 3 additions & 3 deletions integration/templates/vue-vite/src/views/Admin.vue
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<script setup lang="ts">
import { Protect } from '@clerk/vue';
import { Show } from '@clerk/vue';
</script>

<template>
<Protect>
<Show :when="{ role: 'org:admin' }">
<p>I am an admin</p>
<template #fallback>
<p>Not an admin</p>
</template>
</Protect>
</Show>
</template>
14 changes: 8 additions & 6 deletions integration/templates/vue-vite/src/views/Home.vue
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
<script setup lang="ts">
import { SignedIn, OrganizationSwitcher, useAuth } from '@clerk/vue';
const { isSignedIn } = useAuth();
import { OrganizationSwitcher, Show } from '@clerk/vue';
</script>

<template>
<SignedIn>
<Show when="signedIn">
<OrganizationSwitcher />
</SignedIn>
</Show>
<div>
<ul>
<li v-if="isSignedIn"><RouterLink to="/profile">Profile</RouterLink></li>
<Show when="signedIn">
<li>
<RouterLink to="/profile">Profile</RouterLink>
</li>
</Show>
</ul>
</div>
</template>
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
<template>
<main>
<SignedIn>
<Show when="signedIn">
<CheckoutButton
planId="cplan_2wMjqdlza0hTJc4HLCoBwAiExhF"
planPeriod="month"
>
Checkout Now
</CheckoutButton>
</SignedIn>
</Show>
</main>
</template>

<script setup lang="ts">
import { SignedIn } from '@clerk/vue';
import { Show } from '@clerk/vue';
import { CheckoutButton } from '@clerk/vue/experimental';
</script>
Loading
Loading