// Centralized configuration management // Handles all environment variables and app configuration interface NostrConfig { relays: string[] adminPubkeys: string[] } interface ApiConfig { baseUrl: string key: string lightningDomain?: string // Optional override for Lightning Address domain } interface PushConfig { vapidPublicKey: string enabled: boolean } interface MarketConfig { defaultNaddr: string lightningEnabled: boolean defaultCurrency: string } interface AppConfig { nostr: NostrConfig api: ApiConfig push: PushConfig market: MarketConfig nostrclient: { url: string enabled: boolean } support: { npub: string } } // Parse JSON environment variables safely function parseJsonEnv(envVar: string | undefined, fallback: any = []): any { if (!envVar) return fallback try { return JSON.parse(envVar) } catch (error) { console.warn(`Failed to parse environment variable: ${envVar}`) return fallback } } // Create the configuration object export const config: AppConfig = { nostr: { relays: parseJsonEnv(import.meta.env.VITE_NOSTR_RELAYS, []), adminPubkeys: parseJsonEnv(import.meta.env.VITE_ADMIN_PUBKEYS, []) }, api: { baseUrl: import.meta.env.VITE_LNBITS_BASE_URL || '', key: import.meta.env.VITE_API_KEY || '', lightningDomain: import.meta.env.VITE_LIGHTNING_DOMAIN // Optional override for Lightning Address domain }, push: { vapidPublicKey: import.meta.env.VITE_VAPID_PUBLIC_KEY || '', enabled: Boolean(import.meta.env.VITE_PUSH_NOTIFICATIONS_ENABLED) }, market: { defaultNaddr: import.meta.env.VITE_MARKET_NADDR || '', lightningEnabled: Boolean(import.meta.env.VITE_LIGHTNING_ENABLED), defaultCurrency: import.meta.env.VITE_MARKET_DEFAULT_CURRENCY || 'sat' }, nostrclient: { url: import.meta.env.VITE_NOSTRCLIENT_URL || 'wss://localhost:5000/nostrclient/api/v1', enabled: Boolean(import.meta.env.VITE_NOSTRCLIENT_ENABLED) }, support: { npub: import.meta.env.VITE_SUPPORT_NPUB || '' } } as const // Debug logging console.log('🔧 Config loaded:', { VITE_LNBITS_BASE_URL: import.meta.env.VITE_LNBITS_BASE_URL, apiBaseUrl: config.api.baseUrl, apiKey: config.api.key ? '***' : 'not set' }) // Utility functions for common config operations export const configUtils = { isAdminPubkey: (pubkey: string): boolean => { return config.nostr.adminPubkeys.includes(pubkey) }, hasNostrConfig: (): boolean => { return config.nostr.relays.length > 0 }, hasApiConfig: (): boolean => { return Boolean(config.api.baseUrl && config.api.key) }, hasPushConfig: (): boolean => { return Boolean(config.push.vapidPublicKey && config.push.enabled) }, hasMarketConfig: (): boolean => { return Boolean(config.market.defaultNaddr) }, getDefaultRelays: (): string[] => { return config.nostr.relays }, getMarketRelays: (): string[] => { // Market now uses the same relays as the main Nostr configuration return config.nostr.relays } } // Export individual config sections for convenience export const { nostr: nostrConfig, api: apiConfig, market: marketConfig } = config