90 lines
3.7 KiB
JavaScript
90 lines
3.7 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.loadConfig = loadConfig;
|
|
const zod_1 = require("zod");
|
|
const dotenv_1 = __importDefault(require("dotenv"));
|
|
dotenv_1.default.config();
|
|
const configSchema = zod_1.z.object({
|
|
port: zod_1.z.coerce.number().default(3001),
|
|
host: zod_1.z.string().default('0.0.0.0'),
|
|
nodeEnv: zod_1.z.enum(['development', 'production', 'test']).default('development'),
|
|
db: zod_1.z.object({
|
|
driver: zod_1.z.enum(['sqlite', 'postgres']).default('sqlite'),
|
|
path: zod_1.z.string().default('./data/abe.db'),
|
|
url: zod_1.z.string().optional(),
|
|
}),
|
|
auth: zod_1.z.object({
|
|
secret: zod_1.z.string().min(16).default('abe-dev-secret-change-in-prod'),
|
|
sessionMaxAge: zod_1.z.coerce.number().default(86400),
|
|
}),
|
|
storage: zod_1.z.object({
|
|
driver: zod_1.z.enum(['local', 's3']).default('local'),
|
|
path: zod_1.z.string().default('./data/storage'),
|
|
}),
|
|
cors: zod_1.z.object({ origin: zod_1.z.string().default('http://localhost:5173') }),
|
|
log: zod_1.z.object({ level: zod_1.z.enum(['debug', 'info', 'warn', 'error']).default('info') }),
|
|
api: zod_1.z.object({
|
|
key: zod_1.z.string().default('abe-dev-key-123'),
|
|
rateLimitWindowMs: zod_1.z.coerce.number().default(900000),
|
|
rateLimitMax: zod_1.z.coerce.number().default(100),
|
|
}),
|
|
ai: zod_1.z.object({
|
|
provider: zod_1.z.enum(['claude', 'openai', 'ollama', 'none']).default('none'),
|
|
apiKey: zod_1.z.string().default(''),
|
|
autoEnrich: zod_1.z.coerce.boolean().default(false),
|
|
minSeverity: zod_1.z.enum(['low', 'medium', 'high', 'critical']).default('high'),
|
|
}),
|
|
jobs: zod_1.z.object({
|
|
maxConcurrentSessions: zod_1.z.coerce.number().default(3),
|
|
pollIntervalMs: zod_1.z.coerce.number().default(1000),
|
|
}),
|
|
license: zod_1.z.object({ key: zod_1.z.string().default('') }),
|
|
});
|
|
function loadConfig() {
|
|
const raw = {
|
|
port: process.env['ABE_PORT'] ?? process.env['PORT'],
|
|
host: process.env['ABE_HOST'],
|
|
nodeEnv: process.env['NODE_ENV'],
|
|
db: {
|
|
driver: process.env['ABE_DB_DRIVER'],
|
|
path: process.env['ABE_DB_PATH'],
|
|
url: process.env['ABE_DB_URL'],
|
|
},
|
|
auth: {
|
|
secret: process.env['ABE_AUTH_SECRET'],
|
|
sessionMaxAge: process.env['ABE_SESSION_MAX_AGE'],
|
|
},
|
|
storage: {
|
|
driver: process.env['ABE_STORAGE_DRIVER'],
|
|
path: process.env['ABE_STORAGE_PATH'],
|
|
},
|
|
cors: { origin: process.env['ABE_CORS_ORIGIN'] },
|
|
log: { level: process.env['ABE_LOG_LEVEL'] },
|
|
api: {
|
|
key: process.env['ABE_API_KEY'],
|
|
rateLimitWindowMs: process.env['ABE_RATE_LIMIT_WINDOW_MS'],
|
|
rateLimitMax: process.env['ABE_RATE_LIMIT_MAX'],
|
|
},
|
|
ai: {
|
|
provider: process.env['ABE_AI_PROVIDER'],
|
|
apiKey: process.env['ABE_AI_API_KEY'],
|
|
autoEnrich: process.env['ABE_AI_AUTO_ENRICH'],
|
|
minSeverity: process.env['ABE_AI_MIN_SEVERITY'],
|
|
},
|
|
jobs: {
|
|
maxConcurrentSessions: process.env['ABE_JOBS_MAX_CONCURRENT'],
|
|
pollIntervalMs: process.env['ABE_JOBS_POLL_INTERVAL_MS'],
|
|
},
|
|
license: { key: process.env['ABE_LICENSE_KEY'] },
|
|
};
|
|
const result = configSchema.safeParse(raw);
|
|
if (!result.success) {
|
|
const issues = result.error.issues.map(i => `${i.path.join('.')}: ${i.message}`).join('\n');
|
|
throw new Error(`Invalid configuration:\n${issues}`);
|
|
}
|
|
return result.data;
|
|
}
|