function required(name: string) { const value = process.env[name]?.trim() if (!value) throw new Error(`Missing required environment variable ${name}`) return value } function list(name: string, fallback: string[]) { const raw = process.env[name]?.trim() if (!raw) return fallback return [...new Set(raw.split(',').map((value) => value.trim()).filter(Boolean))] } const desktopClientId = process.env.KEYCLOAK_DESKTOP_CLIENT_ID?.trim() || 'fieldlens-print' export const config = { port: Number(process.env.PORT ?? '3000'), databaseUrl: required('DATABASE_URL'), issuer: required('KEYCLOAK_ISSUER').replace(/\/$/, ''), jwksUri: (process.env.KEYCLOAK_JWKS_URI ?? '').trim(), audience: process.env.KEYCLOAK_AUDIENCE?.trim() || 'fieldlens-api', browserClientId: process.env.KEYCLOAK_BROWSER_CLIENT_ID?.trim() || 'fieldlens', desktopClientId, desktopClientIds: list('KEYCLOAK_DESKTOP_CLIENT_IDS', [ desktopClientId, 'fieldlens-print-desktop', ]), machineClientId: process.env.KEYCLOAK_MACHINE_CLIENT_ID?.trim() || 'fieldlens-integration', tenantId: process.env.FIELDLENS_TENANT_ID?.trim() || 'fieldlens-production', environment: process.env.FIELDLENS_ENV?.trim() || 'development', logLevel: process.env.LOG_LEVEL?.trim() || 'info', webOrigin: process.env.WEB_ORIGIN?.trim() || 'http://localhost:5173', staticDir: process.env.STATIC_DIR?.trim() || '', desktopDownloadBaseUrl: process.env.FIELDLENS_DESKTOP_DOWNLOAD_BASE_URL?.trim() || 'https://fieldlens-desktop-build.arrowstack.dev', linuxDesktopDownloadBaseUrl: process.env.FIELDLENS_LINUX_DESKTOP_DOWNLOAD_BASE_URL?.trim() || process.env.FIELDLENS_DESKTOP_DOWNLOAD_BASE_URL?.trim() || 'https://fieldlens-desktop-build.arrowstack.dev', }