feat(01-01): configure Auth.js v5 JWT + Credentials, route protection middleware

- Created src/lib/auth.ts with NextAuth JWT strategy, 7-day rolling session, Credentials provider
- Created src/app/api/auth/[...nextauth]/route.ts with GET/POST handlers and force-dynamic
- Created middleware.ts at project root (not src/) protecting /agent/* routes
- Fixed db/index.ts: lazy Proxy singleton prevents neon() crash during Next.js build
- npm run build passes; /api/auth/[...nextauth] renders as Dynamic route
This commit is contained in:
Chandler Copeland
2026-03-19 13:33:15 -06:00
parent f46e7027a5
commit e5db79a8f0
4 changed files with 107 additions and 2 deletions

View File

@@ -2,5 +2,23 @@ import { drizzle } from "drizzle-orm/neon-http";
import { neon } from "@neondatabase/serverless";
import * as schema from "./schema";
const sql = neon(process.env.DATABASE_URL!);
export const db = drizzle({ client: sql, schema });
type DrizzleDb = ReturnType<typeof createDb>;
function createDb() {
const url = process.env.DATABASE_URL;
if (!url) {
throw new Error("DATABASE_URL environment variable is not set");
}
const sql = neon(url);
return drizzle({ client: sql, schema });
}
// Lazy singleton — created on first use, not at module load time
let _db: DrizzleDb | undefined;
export const db = new Proxy({} as DrizzleDb, {
get(_target, prop: string | symbol) {
if (!_db) _db = createDb();
return (_db as unknown as Record<string | symbol, unknown>)[prop];
},
});