import { drizzle } from 'drizzle-orm/mysql2'; import mysql from 'mysql2/promise'; import { hash } from '@node-rs/argon2'; import * as schema from '../src/lib/server/schema'; const args = process.argv.slice(2); const flags: Record = {}; for (let i = 0; i < args.length; i += 2) { flags[args[i].replace('--', '')] = args[i + 1]; } async function seedTenant() { const { email, name, password, orgName } = flags; if (!email || !name || !password || !orgName) { console.error('Usage: npx tsx scripts/seed-tenant.ts --email X --name X --password X --orgName X'); process.exit(1); } const pool = mysql.createPool({ uri: process.env.DATABASE_URL }); const db = drizzle(pool, { schema, mode: 'default' }); const passwordHash = await hash(password); await db.insert(schema.users).values({ email, passwordHash, name, role: 'sysadmin', active: true, mustChangePassword: true }); const orgConfigDefaults = [ { key: 'branding', value: { primaryColor: '#0d9488', primaryColorLight: '#14b8a6', primaryColorDark: '#0f766e', accentColor: '#f59e0b', accentColorLight: '#fbbf24', accentColorDark: '#d97706', logoUrl: '' } }, { key: 'org_info', value: { name: orgName, tagline: '', city: '', state: '', phone: '', email, facebookUrl: '', instagramUrl: '' } }, { key: 'locale', value: { language: 'en', currency: 'USD', dateFormat: 'MM/DD/YYYY' } }, { key: 'applications', value: { adoptionEnabled: true, fosterEnabled: true, volunteerEnabled: true, surrenderEnabled: true, adoptionFee: 250 } }, { key: 'setup_complete', value: false } ]; for (const row of orgConfigDefaults) { await db.insert(schema.orgConfig).values({ key: row.key, value: row.value }); } const intakeSources = ['Owner Surrender', 'Stray', 'Transfer', 'Born in Care', 'Other']; for (const sourceName of intakeSources) { await db.insert(schema.intakeSources).values({ name: sourceName }); } console.log(`Tenant seeded: ${email} / [password provided] for ${orgName}`); await pool.end(); } seedTenant().catch(console.error);