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>
95 lines
2.6 KiB
TypeScript
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;
|
|
}
|