/** * Create an admin user in Neon Auth via direct HTTP call. * Run: npx tsx scripts/create-admin-user.ts [email] [password] [name] * * Makes a direct HTTP request to the Neon Auth API so we don't need * a Next.js request context, then updates email_verified in the DB. */ import { config } from "dotenv"; config({ path: ".env.local" }); import pg from "pg"; const { Pool } = pg; async function main() { const email = process.argv[2] ?? "admin@example.com"; const password = process.argv[3] ?? "Admin1234!"; const name = process.argv[4] ?? "Admin"; const baseUrl = process.env.NEON_AUTH_BASE_URL!; console.log(`Creating user: ${email}`); const res = await fetch(`${baseUrl}/sign-up/email`, { method: "POST", headers: { "Content-Type": "application/json", "Origin": "http://localhost:4000", "x-neon-auth-proxy": "node", }, body: JSON.stringify({ email, password, name, callbackURL: "/admin" }), }); const data = await res.json().catch(() => ({})); console.log(`Sign-up status: ${res.status}`); if (!res.ok) { console.error("Failed to create user:", JSON.stringify(data)); process.exit(1); } const userId = data.user?.id; console.log("User created:", data.user?.email, "| ID:", userId); // Mark email verified in DB so they can log in immediately if (userId) { const pool = new Pool({ connectionString: process.env.DATABASE_URL }); try { await pool.query( "UPDATE neon_auth.user SET email_verified = true WHERE id = $1", [userId] ); console.log("Email verified in DB."); } finally { await pool.end(); } } console.log(`\nLog in at http://localhost:4000/login with ${email} / ${password}`); } main();