{"repo": "265barancan/ugcai", "files": {"lib/env.ts": {"3b46a1b8251c05d890cbc197cbdb85f20fb7a501": {"t": 1785745563.3809884, "n": 2981, "h": "2de555745d20ab44", "c": "/**\n * Environment variable validation utility\n * Validates required environment variables at startup\n */\n\ninterface EnvConfig {\n REPLICATE_API_TOKEN: string;\n ELEVENLABS_API_KEY: string;\n ELEVENLABS_VOICE_ID?: string;\n NEXT_PUBLIC_APP_URL?: string;\n GEMINI_API_KEY?: string;\n GROK_API_KEY?: string;\n DEEPSEEK_API_KEY?: string;\n FAL_API_KEY?: string;\n HUGGINGFACE_API_KEY?: string;\n}\n\nconst requiredEnvVars = [\"REPLICATE_API_TOKEN\", \"ELEVENLABS_API_KEY\"] as const;\nconst optionalEnvVars = [\"ELEVENLABS_VOICE_ID\", \"NEXT_PUBLIC_APP_URL\", \"GEMINI_API_KEY\", \"GROK_API_KEY\", \"DEEPSEEK_API_KEY\", \"FAL_API_KEY\", \"HUGGINGFACE_API_KEY\"] as const;\n\nexport function validateEnv(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // Check required environment variables\n for (const envVar of requiredEnvVars) {\n const value = process.env[envVar];\n if (!value || value.trim() === \"\") {\n errors.push(`${envVar} is required but not set`);\n } else if (value.length < 10) {\n errors.push(`${envVar} appears to be invalid (too short)`);\n }\n }\n\n // Validate REPLICATE_API_TOKEN format (should start with r8_)\n const replicateToken = process.env.REPLICATE_API_TOKEN;\n if (replicateToken && !replicateToken.startsWith(\"r8_\")) {\n errors.push(\"REPLICATE_API_TOKEN should start with 'r8_'\");\n }\n\n // Validate ELEVENLABS_API_KEY format (should be a valid API key)\n const elevenlabsKey = process.env.ELEVENLABS_API_KEY;\n if (elevenlabsKey && elevenlabsKey.length < 20) {\n errors.push(\"ELEVENLABS_API_KEY appears to be invalid (too short)\");\n }\n\n // Validate ELEVENLABS_VOICE_ID format if provided (should be 21 characters)\n const voiceId = process.env.ELEVENLABS_VOICE_ID;\n if (voiceId && !/^[a-zA-Z0-9]{21}$/.test(voiceId)) {\n errors.push(\"ELEVENLABS_VOICE_ID should be 21 alphanumeric characters\");\n }\n\n // Validate NEXT_PUBLIC_APP_URL format if provided (should be a valid URL)\n const appUrl = process.env.NEXT_PUBLIC_APP_URL;\n if (appUrl) {\n try {\n new URL(appUrl);\n } catch {\n errors.push(\"NEXT_PUBLIC_APP_URL should be a valid URL\");\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function getEnv(): EnvConfig {\n const validation = validateEnv();\n \n if (!validation.valid) {\n throw new Error(\n `Environment validation failed:\\n${validation.errors.join(\"\\n\")}`\n );\n }\n\n return {\n REPLICATE_API_TOKEN: process.env.REPLICATE_API_TOKEN!,\n ELEVENLABS_API_KEY: process.env.ELEVENLABS_API_KEY!,\n ELEVENLABS_VOICE_ID: process.env.ELEVENLABS_VOICE_ID,\n NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL,\n };\n}\n\n// Validate on module load (server-side only)\nif (typeof window === \"undefined\") {\n const validation = validateEnv();\n if (!validation.valid) {\n console.warn(\n \"⚠️ Environment validation warnings:\\n\" +\n validation.errors.map((e) => ` - ${e}`).join(\"\\n\") +\n \"\\n\\nSome features may not work correctly.\"\n );\n }\n}\n\n"}, "560bd9bf178434fee0f590f5913969f762460ca0": {"t": 1785754250.7618005, "n": 2981, "h": "2de555745d20ab44", "c": "/**\n * Environment variable validation utility\n * Validates required environment variables at startup\n */\n\ninterface EnvConfig {\n REPLICATE_API_TOKEN: string;\n ELEVENLABS_API_KEY: string;\n ELEVENLABS_VOICE_ID?: string;\n NEXT_PUBLIC_APP_URL?: string;\n GEMINI_API_KEY?: string;\n GROK_API_KEY?: string;\n DEEPSEEK_API_KEY?: string;\n FAL_API_KEY?: string;\n HUGGINGFACE_API_KEY?: string;\n}\n\nconst requiredEnvVars = [\"REPLICATE_API_TOKEN\", \"ELEVENLABS_API_KEY\"] as const;\nconst optionalEnvVars = [\"ELEVENLABS_VOICE_ID\", \"NEXT_PUBLIC_APP_URL\", \"GEMINI_API_KEY\", \"GROK_API_KEY\", \"DEEPSEEK_API_KEY\", \"FAL_API_KEY\", \"HUGGINGFACE_API_KEY\"] as const;\n\nexport function validateEnv(): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // Check required environment variables\n for (const envVar of requiredEnvVars) {\n const value = process.env[envVar];\n if (!value || value.trim() === \"\") {\n errors.push(`${envVar} is required but not set`);\n } else if (value.length < 10) {\n errors.push(`${envVar} appears to be invalid (too short)`);\n }\n }\n\n // Validate REPLICATE_API_TOKEN format (should start with r8_)\n const replicateToken = process.env.REPLICATE_API_TOKEN;\n if (replicateToken && !replicateToken.startsWith(\"r8_\")) {\n errors.push(\"REPLICATE_API_TOKEN should start with 'r8_'\");\n }\n\n // Validate ELEVENLABS_API_KEY format (should be a valid API key)\n const elevenlabsKey = process.env.ELEVENLABS_API_KEY;\n if (elevenlabsKey && elevenlabsKey.length < 20) {\n errors.push(\"ELEVENLABS_API_KEY appears to be invalid (too short)\");\n }\n\n // Validate ELEVENLABS_VOICE_ID format if provided (should be 21 characters)\n const voiceId = process.env.ELEVENLABS_VOICE_ID;\n if (voiceId && !/^[a-zA-Z0-9]{21}$/.test(voiceId)) {\n errors.push(\"ELEVENLABS_VOICE_ID should be 21 alphanumeric characters\");\n }\n\n // Validate NEXT_PUBLIC_APP_URL format if provided (should be a valid URL)\n const appUrl = process.env.NEXT_PUBLIC_APP_URL;\n if (appUrl) {\n try {\n new URL(appUrl);\n } catch {\n errors.push(\"NEXT_PUBLIC_APP_URL should be a valid URL\");\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function getEnv(): EnvConfig {\n const validation = validateEnv();\n \n if (!validation.valid) {\n throw new Error(\n `Environment validation failed:\\n${validation.errors.join(\"\\n\")}`\n );\n }\n\n return {\n REPLICATE_API_TOKEN: process.env.REPLICATE_API_TOKEN!,\n ELEVENLABS_API_KEY: process.env.ELEVENLABS_API_KEY!,\n ELEVENLABS_VOICE_ID: process.env.ELEVENLABS_VOICE_ID,\n NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL,\n };\n}\n\n// Validate on module load (server-side only)\nif (typeof window === \"undefined\") {\n const validation = validateEnv();\n if (!validation.valid) {\n console.warn(\n \"⚠️ Environment validation warnings:\\n\" +\n validation.errors.map((e) => ` - ${e}`).join(\"\\n\") +\n \"\\n\\nSome features may not work correctly.\"\n );\n }\n}\n\n"}}}}