Files
skillhub/apps/web/lib/env.ts
airano 97b427831a Initial release v1.0.0
Open-source marketplace for AI Agent skills.

Features:
- Next.js 15 web app with i18n (en/fa)
- CLI tool for skill installation (npx skillhub)
- GitHub crawler/indexer with multi-strategy discovery
- Security scanning for all indexed skills
- Self-hostable with Docker

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 06:42:07 +03:30

95 lines
2.6 KiB
TypeScript

/**
* Environment variable validation
* Validates required environment variables at startup
*/
interface EnvValidationResult {
valid: boolean;
missing: string[];
warnings: string[];
}
// Required environment variables (app will fail without these)
const REQUIRED_ENV_VARS = ['DATABASE_URL'];
// Recommended environment variables (app works but with reduced functionality)
const RECOMMENDED_ENV_VARS = ['GITHUB_TOKEN', 'AUTH_SECRET', 'GITHUB_CLIENT_ID', 'GITHUB_CLIENT_SECRET'];
// Optional environment variables (nice to have)
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const OPTIONAL_ENV_VARS = ['MEILI_URL', 'MEILI_MASTER_KEY', 'REDIS_URL'];
/**
* Validate environment variables
* Call this at application startup to fail fast if critical env vars are missing
*/
export function validateEnv(): EnvValidationResult {
const missing: string[] = [];
const warnings: string[] = [];
// Check required variables
for (const envVar of REQUIRED_ENV_VARS) {
if (!process.env[envVar]) {
missing.push(envVar);
}
}
// Check recommended variables (warn but don't fail)
for (const envVar of RECOMMENDED_ENV_VARS) {
if (!process.env[envVar]) {
warnings.push(`${envVar} not set - some features may not work`);
}
}
// Specific warnings for missing optional features
if (!process.env.GITHUB_TOKEN) {
warnings.push('GITHUB_TOKEN not set - limited to 60 GitHub API requests/hour');
}
if (!process.env.MEILI_URL) {
warnings.push('MEILI_URL not set - using PostgreSQL for search (slower)');
}
return {
valid: missing.length === 0,
missing,
warnings,
};
}
/**
* Validate and throw if critical env vars are missing
* Use this in server components/API routes for fail-fast behavior
*/
export function requireEnv(): void {
const result = validateEnv();
if (!result.valid) {
throw new Error(`Missing required environment variables: ${result.missing.join(', ')}`);
}
// Log warnings in development
if (process.env.NODE_ENV === 'development' && result.warnings.length > 0) {
console.warn('Environment warnings:');
result.warnings.forEach((w) => console.warn(` - ${w}`));
}
}
/**
* Get a required environment variable or throw
*/
export function getRequiredEnv(key: string): string {
const value = process.env[key];
if (!value) {
throw new Error(`Required environment variable ${key} is not set`);
}
return value;
}
/**
* Get an optional environment variable with a default value
*/
export function getOptionalEnv(key: string, defaultValue: string): string {
return process.env[key] || defaultValue;
}