94 lines
3.1 KiB
TypeScript
94 lines
3.1 KiB
TypeScript
// @ts-nocheck
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
export function loadConfig({ configPath = "config/local.json", dryRun } = {}) {
|
|
const localConfig = readJsonFile(configPath);
|
|
const exampleConfig = readJsonFile("config/local.example.json");
|
|
const config = mergeConfig(exampleConfig, localConfig);
|
|
const env = readEnvFile(".env");
|
|
|
|
const appMode = String(config.appMode || "dry-run").toLowerCase();
|
|
const resolvedDryRun = dryRun === undefined ? appMode !== "live" : Boolean(dryRun);
|
|
|
|
return {
|
|
appMode,
|
|
dryRun: resolvedDryRun,
|
|
sourceWorkbook: path.resolve(config.sourceWorkbook || "./xxx_endpoint_bo_2026-08-04_v1.xlsm"),
|
|
outputDir: path.resolve(config.outputDir || "./outputs"),
|
|
server: {
|
|
host: config.server?.host || "127.0.0.1",
|
|
port: Number(config.server?.port || 3400),
|
|
},
|
|
endpoint: {
|
|
url: config.endpoint?.url || "https://www.9b-plus.com/apiv1/endpoint/query",
|
|
loginUrl: config.endpoint?.loginUrl || "https://www.9b-plus.com/apiv1/auth/login",
|
|
token: config.endpoint?.token || "",
|
|
username: config.endpoint?.username || "",
|
|
password: config.endpoint?.password || "",
|
|
},
|
|
database: {
|
|
driver: String(env.DB_DRIVER || config.database?.driver || "endpoint").toLowerCase(),
|
|
mode: String(env.DB_MODE || config.database?.mode || "local").toLowerCase(),
|
|
allowLocalWrites: parseBoolean(
|
|
env.DB_LOCAL_ALLOW_WRITES,
|
|
config.database?.allowLocalWrites ?? config.database?.allowWrites,
|
|
),
|
|
host: env.DB_HOST || config.database?.host || "127.0.0.1",
|
|
port: Number(env.DB_PORT || config.database?.port || 3306),
|
|
name: env.DB_NAME || config.database?.name || "catalog_maker_test",
|
|
user: env.DB_USER || config.database?.user || "catalog_maker",
|
|
password: env.DB_PASSWORD || config.database?.password || "",
|
|
scrapeName: env.SCRAPE_DB_NAME || config.database?.scrapeName || "catalog_scrape",
|
|
connectionLimit: Number(env.DB_CONNECTION_LIMIT || config.database?.connectionLimit || 5),
|
|
},
|
|
};
|
|
}
|
|
|
|
function readJsonFile(filePath) {
|
|
if (!fs.existsSync(filePath)) {
|
|
return {};
|
|
}
|
|
|
|
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
}
|
|
|
|
function readEnvFile(filePath) {
|
|
if (!fs.existsSync(filePath)) return {};
|
|
|
|
return Object.fromEntries(
|
|
fs.readFileSync(filePath, "utf8")
|
|
.split(/\r?\n/)
|
|
.map((line) => line.trim())
|
|
.filter((line) => line && !line.startsWith("#") && line.includes("="))
|
|
.map((line) => {
|
|
const separator = line.indexOf("=");
|
|
return [line.slice(0, separator).trim(), line.slice(separator + 1).trim()];
|
|
}),
|
|
);
|
|
}
|
|
|
|
function parseBoolean(value, fallback = false) {
|
|
if (value === undefined) return Boolean(fallback);
|
|
return ["1", "true", "yes", "on"].includes(String(value).toLowerCase());
|
|
}
|
|
|
|
function mergeConfig(base, override) {
|
|
return {
|
|
...base,
|
|
...override,
|
|
server: {
|
|
...base.server,
|
|
...override.server,
|
|
},
|
|
endpoint: {
|
|
...base.endpoint,
|
|
...override.endpoint,
|
|
},
|
|
database: {
|
|
...base.database,
|
|
...override.database,
|
|
},
|
|
};
|
|
}
|