forked from Hri7566/mpp-server-dev2
Config loader that writes default configs
This commit is contained in:
parent
7d25ea57bf
commit
645cffb4ec
|
@ -1,13 +1,73 @@
|
||||||
import YAML from "yaml";
|
import { existsSync, readFileSync, writeFileSync } from "fs";
|
||||||
import fs from "fs";
|
import { parse, stringify } from "yaml";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
export function loadConfig<T>(filepath: string, def: T) {
|
/**
|
||||||
try {
|
* Load a YAML config file and set default values if config path is nonexistent
|
||||||
const data = fs.readFileSync(filepath).toString();
|
*
|
||||||
const parsed = YAML.parse(data);
|
* Usage:
|
||||||
return parsed as T;
|
* ```ts
|
||||||
} catch (err) {
|
* const config = loadConfig("config/services.yml", {
|
||||||
console.error("Unable to load config:", err);
|
* enableMPP: false
|
||||||
return def;
|
* });
|
||||||
|
* ```
|
||||||
|
* @param configPath Path to load config from
|
||||||
|
* @param defaultConfig Config to use if none is present (will save to path if used)
|
||||||
|
* @returns Parsed YAML config
|
||||||
|
*/
|
||||||
|
export function loadConfig<T>(configPath: string, defaultConfig: T): T {
|
||||||
|
// Config exists?
|
||||||
|
if (existsSync(configPath)) {
|
||||||
|
// Load config
|
||||||
|
const data = readFileSync(configPath);
|
||||||
|
const config = parse(data.toString());
|
||||||
|
|
||||||
|
const defRecord = defaultConfig as Record<string, any>;
|
||||||
|
let changed = false;
|
||||||
|
|
||||||
|
function mix(
|
||||||
|
obj: Record<string, unknown>,
|
||||||
|
obj2: Record<string, unknown>
|
||||||
|
) {
|
||||||
|
for (const key of Object.keys(obj2)) {
|
||||||
|
if (typeof obj[key] == "undefined") {
|
||||||
|
obj[key] = obj2[key];
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof obj[key] == "object" && !Array.isArray(obj[key])) {
|
||||||
|
mix(
|
||||||
|
obj[key] as Record<string, unknown>,
|
||||||
|
obj2[key] as Record<string, unknown>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply any missing default values
|
||||||
|
mix(config, defRecord);
|
||||||
|
|
||||||
|
// Save config if modified
|
||||||
|
if (changed) writeConfig(configPath, config);
|
||||||
|
|
||||||
|
return config as T;
|
||||||
|
} else {
|
||||||
|
// Write default config to disk and use that
|
||||||
|
writeConfig(configPath, defaultConfig);
|
||||||
|
return defaultConfig as T;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a YAML config to disk
|
||||||
|
* @param configPath
|
||||||
|
* @param config
|
||||||
|
*/
|
||||||
|
export function writeConfig<T>(configPath: string, config: T) {
|
||||||
|
writeFileSync(
|
||||||
|
configPath,
|
||||||
|
stringify(config, {
|
||||||
|
indent: 4
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue