UNPKG

create-saas-app-ai-chat

Version:

Create a production-ready AI SaaS with Next.js, Supabase, Stripe, and OpenRouter - 15+ AI models included

59 lines (49 loc) 1.91 kB
import { updateSession } from "@/lib/supabase/middleware"; import { NextResponse, type NextRequest } from "next/server"; const setupRoutes = ["/setup"]; export async function middleware(request: NextRequest) { // Check for setup route access const isSetupRoute = setupRoutes.some((route) => request.nextUrl.pathname.startsWith(route) ); // Check if setup is already complete via environment variable // This will be set to 'true' after setup completion const isSetupComplete = process.env.SETUP_COMPLETE === "true"; // If the user requests the root path and setup isn't complete, // redirect them to the setup page. if (request.nextUrl.pathname === "/" && !isSetupComplete) { const url = request.nextUrl.clone(); url.pathname = "/setup"; return NextResponse.redirect(url); } if (isSetupRoute) { // Only allow setup access in development mode if (process.env.NODE_ENV !== "development") { const url = request.nextUrl.clone(); url.pathname = "/404"; return NextResponse.redirect(url); } // Check for force parameter const forceSetup = request.nextUrl.searchParams.get("force") === "true"; if (isSetupComplete && !forceSetup) { const url = request.nextUrl.clone(); url.pathname = "/"; // Redirect to landing page, not dashboard return NextResponse.redirect(url); } // Allow access to setup return NextResponse.next({ request }); } return await updateSession(request); } export const config = { matcher: [ /* * Match all request paths except: * - _next/static (static files) * - _next/image (image optimization files) * - favicon.ico (favicon file) * - images - .svg, .png, .jpg, .jpeg, .gif, .webp */ "/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)", ], };