| name | clerk-upgrade-migration |
| description | Upgrade Clerk SDK versions and handle breaking changes.
Use when upgrading Clerk packages, migrating to new SDK versions,
or handling deprecation warnings.
Trigger with phrases like "upgrade clerk", "clerk migration",
"update clerk SDK", "clerk breaking changes".
|
| allowed-tools | Read, Write, Edit, Bash(npm:*), Bash(pnpm:*), Grep |
| version | 1.0.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
Clerk Upgrade & Migration
Overview
Safely upgrade Clerk SDK versions and handle breaking changes.
Prerequisites
- Current Clerk integration working
- Git repository with clean working state
- Test environment available
Instructions
Step 1: Check Current Version and Available Updates
npm list @clerk/nextjs
npm outdated @clerk/nextjs
npm view @clerk/nextjs versions --json | tail -20
Step 2: Review Breaking Changes
import { authMiddleware } from '@clerk/nextjs'
export default authMiddleware({
publicRoutes: ['/']
})
import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'
const isPublicRoute = createRouteMatcher(['/'])
export default clerkMiddleware(async (auth, req) => {
if (!isPublicRoute(req)) await auth.protect()
})
Step 3: Upgrade Process
git checkout -b upgrade-clerk-sdk
npm install @clerk/nextjs@latest
npm ls @clerk/nextjs
npm run typecheck
npm test
Step 4: Handle Common Migration Patterns
Middleware Migration (v5 to v6)
import { authMiddleware } from '@clerk/nextjs'
export default authMiddleware({
publicRoutes: ['/', '/sign-in', '/sign-up'],
ignoredRoutes: ['/api/webhooks(.*)']
})
import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'
const isPublicRoute = createRouteMatcher([
'/',
'/sign-in(.*)',
'/sign-up(.*)'
])
export default clerkMiddleware(async (auth, request) => {
if (!isPublicRoute(request)) {
await auth.protect()
}
})
Async Auth Migration
import { auth } from '@clerk/nextjs'
export function GET() {
const { userId } = auth()
}
import { auth } from '@clerk/nextjs/server'
export async function GET() {
const { userId } = await auth()
}
Hook Updates
const { isSignedIn, isLoaded } = useAuth()
import { useOrganization } from '@clerk/nextjs'
const { membership } = useOrganization()
import { useOrganization } from '@clerk/nextjs'
const { organization, membership } = useOrganization()
Step 5: Update Import Paths
import { auth, currentUser, clerkClient } from '@clerk/nextjs/server'
import { useUser, useAuth, useClerk } from '@clerk/nextjs'
import {
ClerkProvider,
SignIn,
SignUp,
UserButton,
SignInButton,
SignUpButton
} from '@clerk/nextjs'
Step 6: Test Upgrade
import { describe, it, expect } from 'vitest'
describe('Clerk Upgrade Validation', () => {
it('auth() returns userId for authenticated users', async () => {
})
it('middleware protects routes correctly', async () => {
})
it('webhooks still verify correctly', async () => {
})
})
Step 7: Rollback Plan
git checkout main -- package.json package-lock.json
npm install
npm install @clerk/nextjs@5.7.1
Version Compatibility Matrix
| @clerk/nextjs | Next.js | Node.js |
|---|
| 6.x | 14.x, 15.x | 18.x, 20.x |
| 5.x | 13.x, 14.x | 18.x, 20.x |
| 4.x | 12.x, 13.x | 16.x, 18.x |
Migration Checklist
Output
- Updated Clerk SDK
- Migrated breaking changes
- All tests passing
- Production deployment ready
Error Handling
| Error | Cause | Solution |
|---|
| Type errors after upgrade | API changes | Check changelog, update types |
| Middleware not executing | Matcher syntax changed | Update matcher regex |
| auth() returns Promise | Now async in v6 | Add await to auth() calls |
| Import errors | Path changes | Update to @clerk/nextjs/server |
Resources
Next Steps
After upgrade, review clerk-ci-integration for CI/CD updates.