import { betterAuth } from 'better-auth' import { drizzleAdapter } from 'better-auth/adapters/drizzle' import { tanstackStartCookies } from 'better-auth/tanstack-start' import { env } from '~/env' import { db } from '~/server/db' import { sendPasswordResetEmail, sendVerificationEmail } from './emails' const socialProviders = env.BETTER_AUTH_GOOGLE_CLIENT_ID && env.BETTER_AUTH_GOOGLE_CLIENT_SECRET ? { google: { clientId: env.BETTER_AUTH_GOOGLE_CLIENT_ID, clientSecret: env.BETTER_AUTH_GOOGLE_CLIENT_SECRET, }, } : undefined export const auth = betterAuth({ database: drizzleAdapter(db, { provider: 'pg', }), emailAndPassword: { enabled: true, minPasswordLength: 8, requireEmailVerification: true, sendResetPassword: async ({ user, url }) => { await sendPasswordResetEmail({ to: { email: user.email, name: user.name }, url, }) }, }, emailVerification: { sendOnSignUp: true, autoSignInAfterVerification: true, expiresIn: 60 * 60, sendVerificationEmail: async ({ user, url }) => { await sendVerificationEmail({ to: { email: user.email, name: user.name }, url, }) }, }, socialProviders, user: { additionalFields: {}, }, trustedOrigins: [env.BETTER_AUTH_URL], rateLimit: { enabled: env.NODE_ENV === 'production', window: 60, max: 100, customRules: { '/sign-up/email': { window: 60, max: 5 }, '/sign-in/email': { window: 60, max: 10 }, '/forget-password': { window: 60, max: 3 }, '/request-password-reset': { window: 60, max: 3 }, '/send-verification-email': { window: 60, max: 3 }, }, }, plugins: [tanstackStartCookies()], }) export type Session = typeof auth.$Infer.Session