From 44895f9c31f311b1412273e17160b1fe8d1782eb Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Mon, 16 Feb 2026 17:22:41 -0800 Subject: [PATCH] Fix SuperTokens build error with lazy initialization - Move SuperTokens.init() to runtime (not build time) - Add dynamic route config to prevent build-time evaluation - Move appInfo inside backendConfig function - Update default URLs to vibnai.com Co-authored-by: Cursor --- app/api/auth/[[...path]]/route.ts | 26 ++++++++++++++++++++++++-- lib/supertokens/backendConfig.ts | 22 ++++++++++++---------- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/app/api/auth/[[...path]]/route.ts b/app/api/auth/[[...path]]/route.ts index 6a352fa..d8e971a 100644 --- a/app/api/auth/[[...path]]/route.ts +++ b/app/api/auth/[[...path]]/route.ts @@ -3,36 +3,58 @@ import SuperTokens from "supertokens-node"; import { backendConfig } from "@/lib/supertokens/backendConfig"; import { getAppDirRequestHandler } from "supertokens-node/nextjs"; -SuperTokens.init(backendConfig()); +// Tell Next.js this is a dynamic route (don't evaluate at build time) +export const dynamic = 'force-dynamic'; +export const runtime = 'nodejs'; -const handleRequest = getAppDirRequestHandler(NextResponse); +// Initialize SuperTokens lazily (only when first request comes in) +let initialized = false; + +function ensureInitialized() { + if (!initialized && typeof window === 'undefined') { + SuperTokens.init(backendConfig()); + initialized = true; + } +} export async function GET(request: NextRequest) { + ensureInitialized(); + const handleRequest = getAppDirRequestHandler(NextResponse); const response = await handleRequest(request); return response; } export async function POST(request: NextRequest) { + ensureInitialized(); + const handleRequest = getAppDirRequestHandler(NextResponse); const response = await handleRequest(request); return response; } export async function DELETE(request: NextRequest) { + ensureInitialized(); + const handleRequest = getAppDirRequestHandler(NextResponse); const response = await handleRequest(request); return response; } export async function PUT(request: NextRequest) { + ensureInitialized(); + const handleRequest = getAppDirRequestHandler(NextResponse); const response = await handleRequest(request); return response; } export async function PATCH(request: NextRequest) { + ensureInitialized(); + const handleRequest = getAppDirRequestHandler(NextResponse); const response = await handleRequest(request); return response; } export async function HEAD(request: NextRequest) { + ensureInitialized(); + const handleRequest = getAppDirRequestHandler(NextResponse); const response = await handleRequest(request); return response; } diff --git a/lib/supertokens/backendConfig.ts b/lib/supertokens/backendConfig.ts index 17cd884..9a0e88f 100644 --- a/lib/supertokens/backendConfig.ts +++ b/lib/supertokens/backendConfig.ts @@ -4,20 +4,22 @@ import SessionNode from "supertokens-node/recipe/session"; import { TypeInput } from "supertokens-node/types"; import { AppInfoUserInput } from "supertokens-node/types"; -const appInfo: AppInfoUserInput = { - appName: "Vib'n", - apiDomain: process.env.NEXT_PUBLIC_APP_URL || "https://app.vibnai.com", - websiteDomain: process.env.NEXT_PUBLIC_APP_URL || "https://app.vibnai.com", - apiBasePath: "/api/auth", - websiteBasePath: "/auth", -}; - export const backendConfig = (): TypeInput => { + const appUrl = process.env.NEXT_PUBLIC_APP_URL || "https://vibnai.com"; + + const appInfo: AppInfoUserInput = { + appName: "Vib'n", + apiDomain: appUrl, + websiteDomain: appUrl, + apiBasePath: "/api/auth", + websiteBasePath: "/auth", + }; + return { framework: "custom", supertokens: { - connectionURI: process.env.SUPERTOKENS_CONNECTION_URI || "https://auth.vibnai.com", - apiKey: process.env.SUPERTOKENS_API_KEY, + connectionURI: process.env.SUPERTOKENS_CONNECTION_URI || "http://j04ckwg0k040o08gc04gs80o:3567", + apiKey: process.env.SUPERTOKENS_API_KEY || "", }, appInfo, recipeList: [