- Implement flexible environment variable loading strategy - Add support for environment-specific and local override configuration files - Create new `loadEnv.ts` module for dynamic environment configuration - Update configuration loading in multiple config files - Remove deprecated `.env.development.template` - Add setup script for environment validation - Improve WebSocket error handling and client configuration
90 lines
2.6 KiB
TypeScript
90 lines
2.6 KiB
TypeScript
import { loadEnvironmentVariables } from "./loadEnv";
|
|
|
|
// Load environment variables from the appropriate files
|
|
loadEnvironmentVariables();
|
|
|
|
// Home Assistant Configuration
|
|
export const HASS_CONFIG = {
|
|
HOST: process.env.HASS_HOST || "http://homeassistant.local:8123",
|
|
TOKEN: process.env.HASS_TOKEN,
|
|
SOCKET_URL:
|
|
process.env.HASS_SOCKET_URL ||
|
|
"ws://homeassistant.local:8123/api/websocket",
|
|
BASE_URL: process.env.HASS_HOST || "http://homeassistant.local:8123",
|
|
SOCKET_TOKEN: process.env.HASS_TOKEN,
|
|
};
|
|
|
|
// Server Configuration
|
|
export const SERVER_CONFIG = {
|
|
PORT: parseInt(process.env.PORT || "3000", 10),
|
|
NODE_ENV: process.env.NODE_ENV || "development",
|
|
DEBUG: process.env.DEBUG === "true",
|
|
LOG_LEVEL: process.env.LOG_LEVEL || "info",
|
|
};
|
|
|
|
// AI Configuration
|
|
export const AI_CONFIG = {
|
|
PROCESSOR_TYPE: process.env.PROCESSOR_TYPE || "claude",
|
|
OPENAI_API_KEY: process.env.OPENAI_API_KEY,
|
|
};
|
|
|
|
// Rate Limiting Configuration
|
|
export const RATE_LIMIT_CONFIG = {
|
|
REGULAR: parseInt(process.env.RATE_LIMIT_REGULAR || "100", 10),
|
|
WEBSOCKET: parseInt(process.env.RATE_LIMIT_WEBSOCKET || "1000", 10),
|
|
};
|
|
|
|
// Security Configuration
|
|
export const SECURITY_CONFIG = {
|
|
JWT_SECRET:
|
|
process.env.JWT_SECRET || "default_secret_key_change_in_production",
|
|
CORS_ORIGINS: (
|
|
process.env.CORS_ORIGINS || "http://localhost:3000,http://localhost:8123"
|
|
)
|
|
.split(",")
|
|
.map((origin) => origin.trim()),
|
|
};
|
|
|
|
// Test Configuration
|
|
export const TEST_CONFIG = {
|
|
HASS_HOST: process.env.TEST_HASS_HOST || "http://localhost:8123",
|
|
HASS_TOKEN: process.env.TEST_HASS_TOKEN || "test_token",
|
|
HASS_SOCKET_URL:
|
|
process.env.TEST_HASS_SOCKET_URL || "ws://localhost:8123/api/websocket",
|
|
PORT: parseInt(process.env.TEST_PORT || "3001", 10),
|
|
};
|
|
|
|
// Mock Configuration (for testing)
|
|
export const MOCK_CONFIG = {
|
|
SERVICES: process.env.MOCK_SERVICES === "true",
|
|
RESPONSES_DIR: process.env.MOCK_RESPONSES_DIR || "__tests__/mock-responses",
|
|
};
|
|
|
|
// Validate required configuration
|
|
function validateConfig() {
|
|
const missingVars: string[] = [];
|
|
|
|
if (!HASS_CONFIG.TOKEN) missingVars.push("HASS_TOKEN");
|
|
if (!SECURITY_CONFIG.JWT_SECRET) missingVars.push("JWT_SECRET");
|
|
|
|
if (missingVars.length > 0) {
|
|
throw new Error(
|
|
`Missing required environment variables: ${missingVars.join(", ")}`,
|
|
);
|
|
}
|
|
}
|
|
|
|
// Export configuration validation
|
|
export const validateConfiguration = validateConfig;
|
|
|
|
// Export all configurations as a single object
|
|
export const AppConfig = {
|
|
HASS: HASS_CONFIG,
|
|
SERVER: SERVER_CONFIG,
|
|
AI: AI_CONFIG,
|
|
RATE_LIMIT: RATE_LIMIT_CONFIG,
|
|
SECURITY: SECURITY_CONFIG,
|
|
TEST: TEST_CONFIG,
|
|
MOCK: MOCK_CONFIG,
|
|
};
|