import { z } from 'zod'; const configSchema = z.object({ NODE_ENV: z.enum(['development', 'test', 'production']).default('development'), QIPAI_API_HOST: z.string().min(1).default('0.0.0.0'), QIPAI_API_PORT: z.coerce.number().int().min(1).max(65535).default(3001), QIPAI_API_VERSION: z.string().min(1).default('0.1.0'), QIPAI_API_CORS_ORIGINS: z.string().default('https://api.txyundm.cn'), QIPAI_MYSQL_HOST: z.string().min(1).default('127.0.0.1'), QIPAI_MYSQL_PORT: z.coerce.number().int().min(1).max(65535).default(3306), QIPAI_MYSQL_DATABASE: z.string().min(1).default('qipai'), QIPAI_MYSQL_USER: z.string().min(1).default('qipai_app'), QIPAI_MYSQL_PASSWORD: z.string().default(''), QIPAI_MYSQL_CONNECTION_LIMIT: z.coerce.number().int().min(1).max(50).default(10), QIPAI_JWT_SECRET: z.string().min(32).default('development-only-change-this-jwt-secret'), QIPAI_ACCESS_TOKEN_TTL_SECONDS: z.coerce.number().int().min(60).max(86400).default(900), QIPAI_SESSION_TTL_SECONDS: z.coerce.number().int().min(300).max(2592000).default(604800), QIPAI_WECHAT_APP_SECRETS: z.string().default('{}'), QIPAI_MQTT_URL: z.string().url().default('mqtt://101.42.38.246:1883'), QIPAI_MQTT_USERNAME: z.string().default(''), QIPAI_MQTT_PASSWORD: z.string().default('') }); export type AppConfig = ReturnType; export function loadConfig(env: NodeJS.ProcessEnv = process.env) { const parsed = configSchema.parse(env); if ( parsed.NODE_ENV === 'production' && parsed.QIPAI_JWT_SECRET === 'development-only-change-this-jwt-secret' ) { throw new Error('QIPAI_JWT_SECRET must be explicitly configured in production.'); } return { nodeEnv: parsed.NODE_ENV, host: parsed.QIPAI_API_HOST, port: parsed.QIPAI_API_PORT, version: parsed.QIPAI_API_VERSION, corsOrigins: parsed.QIPAI_API_CORS_ORIGINS.split(',').map((item) => item.trim()).filter(Boolean), mysql: { host: parsed.QIPAI_MYSQL_HOST, port: parsed.QIPAI_MYSQL_PORT, database: parsed.QIPAI_MYSQL_DATABASE, user: parsed.QIPAI_MYSQL_USER, credential: parsed.QIPAI_MYSQL_PASSWORD, passwordConfigured: parsed.QIPAI_MYSQL_PASSWORD.length > 0, connectionLimit: parsed.QIPAI_MYSQL_CONNECTION_LIMIT }, auth: { jwtSecret: parsed.QIPAI_JWT_SECRET, accessTokenTtlSeconds: parsed.QIPAI_ACCESS_TOKEN_TTL_SECONDS, sessionTtlSeconds: parsed.QIPAI_SESSION_TTL_SECONDS, wechatAppSecretsJson: parsed.QIPAI_WECHAT_APP_SECRETS }, mqtt: { url: parsed.QIPAI_MQTT_URL, usernameConfigured: parsed.QIPAI_MQTT_USERNAME.length > 0, passwordConfigured: parsed.QIPAI_MQTT_PASSWORD.length > 0 } }; }