import { hashPassword } from "../src/worker/lib/password"; async function readPassword() { if (!process.stdin.isTTY) { return (await new Response(Bun.stdin.stream()).text()).trimEnd(); } process.stdout.write("Password: "); process.stdin.setRawMode(true); process.stdin.resume(); process.stdin.setEncoding("utf8"); return new Promise((resolve, reject) => { let password = ""; const cleanup = () => { process.stdin.setRawMode(false); process.stdin.pause(); process.stdout.write("\n"); }; process.stdin.on("data", (key: string) => { if (key === "\u0003") { cleanup(); reject(new Error("Cancelled")); return; } if (key === "\r" || key === "\n") { cleanup(); resolve(password); return; } if (key === "\u007f" || key === "\b") { password = password.slice(0, -1); return; } password += key; }); }); } function sqlValue(value: string) { return `'${value.replaceAll("'", "''")}'`; } function shellDoubleQuoted(value: string) { return value.replace(/[\\"$`]/g, "\\$&"); } const password = await readPassword(); if (password.length < 8) { console.error("Password must contain at least 8 characters."); process.exit(1); } const now = Date.now(); const statement = [ "INSERT OR REPLACE INTO admin_credentials", "(id, password_hash, created_at, updated_at)", `VALUES (1, ${sqlValue(await hashPassword(password))}, ${now}, ${now});`, ].join(" "); console.log("\nLocal database:"); console.log(`bunx wrangler d1 execute uptime --local --command "${shellDoubleQuoted(statement)}"`); console.log("\nRemote database:"); console.log(`bunx wrangler d1 execute uptime --remote --command "${shellDoubleQuoted(statement)}"`);