From d37a084715475c97961e88eaded10a2ffd753a77 Mon Sep 17 00:00:00 2001 From: wass08 Date: Wed, 11 Feb 2026 16:35:56 +0900 Subject: [PATCH] fix build env --- packages/auth/src/server.ts | 142 ++++++++++++++++++++---------------- 1 file changed, 80 insertions(+), 62 deletions(-) diff --git a/packages/auth/src/server.ts b/packages/auth/src/server.ts index 73988b7b..4a84ec9e 100644 --- a/packages/auth/src/server.ts +++ b/packages/auth/src/server.ts @@ -4,52 +4,55 @@ import { drizzleAdapter } from 'better-auth/adapters/drizzle' import { magicLink } from 'better-auth/plugins' import { Resend } from 'resend' -if (!process.env.BETTER_AUTH_SECRET) { - throw new Error( - 'Missing BETTER_AUTH_SECRET environment variable. Generate one with: openssl rand -base64 32', - ) -} +let _auth: ReturnType | null = null -if (!process.env.BETTER_AUTH_URL) { - throw new Error( - 'Missing BETTER_AUTH_URL environment variable. Set it to your app URL (e.g., http://localhost:3000)', - ) -} +function getAuth() { + if (!_auth) { + const betterAuthSecret = process.env.BETTER_AUTH_SECRET + const betterAuthUrl = process.env.BETTER_AUTH_URL -// Initialize Resend for email sending -const resend = process.env.RESEND_API_KEY ? new Resend(process.env.RESEND_API_KEY) : null + if (!betterAuthSecret) { + throw new Error( + 'Missing BETTER_AUTH_SECRET environment variable. Please configure it in your deployment settings or .env.local file. Generate one with: openssl rand -base64 32', + ) + } -/** - * Better Auth server instance - * Configured with PostgreSQL database (Supabase) and magic link authentication - */ -export const auth = betterAuth({ - database: drizzleAdapter(db, { - provider: 'pg', - usePlural: true, - schema, - }), - advanced: { - database: { - generateId: false, // Use our prefixed nanoid IDs from schema - }, - }, - secret: process.env.BETTER_AUTH_SECRET, - baseURL: process.env.BETTER_AUTH_URL, - plugins: [ - magicLink({ - sendMagicLink: async ({ email, url }) => { - if (!resend) { - console.log(`[DEV] Magic link for ${email}: ${url}`) - return - } + if (!betterAuthUrl) { + throw new Error( + 'Missing BETTER_AUTH_URL environment variable. Please configure it in your deployment settings or .env.local file. Set it to your app URL (e.g., http://localhost:3000 or https://yourdomain.com)', + ) + } - try { - await resend.emails.send({ - from: 'Pascal ', - to: email, - subject: 'Sign in to Pascal Editor', - html: ` + // Initialize Resend for email sending + const resend = process.env.RESEND_API_KEY ? new Resend(process.env.RESEND_API_KEY) : null + + _auth = betterAuth({ + database: drizzleAdapter(db, { + provider: 'pg', + usePlural: true, + schema, + }), + advanced: { + database: { + generateId: false, // Use our prefixed nanoid IDs from schema + }, + }, + secret: betterAuthSecret, + baseURL: betterAuthUrl, + plugins: [ + magicLink({ + sendMagicLink: async ({ email, url }) => { + if (!resend) { + console.log(`[DEV] Magic link for ${email}: ${url}`) + return + } + + try { + await resend.emails.send({ + from: 'Pascal ', + to: email, + subject: 'Sign in to Pascal Editor', + html: `

Sign in to Pascal Editor

Click the button below to sign in to your account:

@@ -60,27 +63,42 @@ export const auth = betterAuth({

If you didn't request this email, you can safely ignore it.

`, - }) - console.log(`✓ Magic link email sent to ${email}`) - } catch (error) { - console.error('Failed to send magic link email:', error) - throw error - } + }) + console.log(`✓ Magic link email sent to ${email}`) + } catch (error) { + console.error('Failed to send magic link email:', error) + throw error + } + }, + }), + ], + session: { + expiresIn: 60 * 60 * 24 * 7, // 7 days + updateAge: 60 * 60 * 24, // 1 day + cookieCache: { + enabled: true, + maxAge: 5 * 60, // 5 minutes + }, + additionalFields: { + activePropertyId: { + type: 'string', + }, + }, }, - }), - ], - session: { - expiresIn: 60 * 60 * 24 * 7, // 7 days - updateAge: 60 * 60 * 24, // 1 day - cookieCache: { - enabled: true, - maxAge: 5 * 60, // 5 minutes - }, - additionalFields: { - activePropertyId: { - type: 'string', - }, - }, + }) + } + return _auth +} + +/** + * Better Auth server instance + * Configured with PostgreSQL database (Supabase) and magic link authentication + * + * Initialized lazily to avoid requiring env vars at build time + */ +export const auth = new Proxy({} as ReturnType, { + get(_target, prop) { + return Reflect.get(getAuth(), prop) }, })