import { clerkMiddleware, createRouteMatcher } from "@clerk/nextjs/server"; import { NextRequest, NextResponse } from "next/server"; const isProtectedRoute = createRouteMatcher([ "/dashboard(.*)", "/admin(.*)", "/profile(.*)", ]); const isPublicRoute = createRouteMatcher([ "/sign-in", "/sign-up", "/", "/api/clerk/webhook", ]); const isOnboardingRoute = createRouteMatcher(["/onboarding"]); export default clerkMiddleware(async (auth, req: NextRequest) => { const { userId, sessionClaims, redirectToSignIn } = await auth(); if (!userId && !isPublicRoute(req)) return redirectToSignIn({ returnBackUrl: req.url }); if ( userId && !sessionClaims?.metadata?.onboardingComplete && !isOnboardingRoute(req) ) { const onboardingUrl = new URL("/onboarding", req.url); return NextResponse.redirect(onboardingUrl); } if (userId && !isPublicRoute(req)) return NextResponse.next(); return NextResponse.next(); }); export const config = { matcher: [ // Skip Next.js internals and all static files, unless found in search params "/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)", // Always run for API routes "/(api|trpc)(.*)", ], };