Files
2026-06-24 09:13:18 +08:00

70 lines
2.3 KiB
JavaScript

export function loadConfig(env = process.env) {
const serverName = requireEnv(env, "SERVER_NAME");
const databases = parseList(env.DATABASES);
const defaultDatabase = (env.DATABASE_NAME?.trim() || databases[0] || "").trim();
if (!defaultDatabase) {
throw new Error("DATABASE_NAME or DATABASES must be configured.");
}
const allowedDatabases = mergeUnique([defaultDatabase, ...databases]);
return {
serverName,
defaultDatabase,
allowedDatabases,
user: optional(env.DB_USER),
password: optional(env.DB_PASSWORD),
readOnly: parseBoolean(env.READONLY, false),
enableDdl: parseBoolean(env.ENABLE_DDL, false),
encrypt: parseBoolean(env.DB_ENCRYPT ?? env.ENCRYPT, false),
trustServerCertificate: parseBoolean(env.TRUST_SERVER_CERTIFICATE, false),
connectionTimeoutMs: parsePositiveInt(env.CONNECTION_TIMEOUT, 30) * 1000,
requestTimeoutMs: parsePositiveInt(env.QUERY_TIMEOUT_MS, 30000),
maxRows: parsePositiveInt(env.MAX_ROWS, 1000),
maxWriteRows: parsePositiveInt(env.MAX_WRITE_ROWS, 100)
};
}
function requireEnv(env, name) {
const value = env[name]?.trim();
if (!value) {
throw new Error(`${name} must be configured.`);
}
return value;
}
function optional(value) {
const trimmed = value?.trim();
return trimmed ? trimmed : undefined;
}
function parseList(value) {
return (value ?? "")
.split(",")
.map((item) => item.trim())
.filter(Boolean);
}
function parseBoolean(value, fallback) {
if (value === undefined || value.trim() === "") {
return fallback;
}
return ["1", "true", "yes", "y", "on"].includes(value.trim().toLowerCase());
}
function parsePositiveInt(value, fallback) {
if (value === undefined || value.trim() === "") {
return fallback;
}
const parsed = Number.parseInt(value, 10);
if (!Number.isFinite(parsed) || parsed <= 0) {
throw new Error(`Expected a positive integer but received '${value}'.`);
}
return parsed;
}
function mergeUnique(values) {
const seen = new Set();
const result = [];
for (const value of values) {
const key = value.toLowerCase();
if (!seen.has(key)) {
seen.add(key);
result.push(value);
}
}
return result;
}
//# sourceMappingURL=config.js.map