wakitsu
Version:
Hobby project for managing anime watch list on Kitsu through CLI
72 lines • 2.52 kB
JavaScript
import { writeFileSync } from 'fs';
import { zodKitsuConfigData } from './kitsu/kitsu-schemas.js';
import { parseWithZod, pathJoin, tryCatchAsync } from './utils.js';
import * as z from 'zod';
import { readFile } from 'fs/promises';
import { Printer } from './printer/printer.js';
let _config = {};
const _configFileName = 'wakitsu.json';
const ConfigSchema = z.object({
useColor: z.boolean(),
kitsu: z.object(zodKitsuConfigData),
});
export class Config {
static get(key) {
if (!_config)
throw Error('config not initialized');
return _config[key];
}
static set(key, val) {
_config[key] = val;
}
static getKitsuProp(key) {
if (!_config)
throw Error('config not initialized');
return _config.kitsu[key];
}
static setKitsuProp(key, val) {
if (!_config)
throw Error('config not initialized');
_config.kitsu[key] = val;
}
static setKitsuData(data) {
if (!_config)
throw Error('config not initialized');
_config.kitsu = data;
}
static async init(options) {
const asyncRes = await tryCatchAsync(readFile(pathJoin(process.cwd(), _configFileName)));
if (!asyncRes.success) {
if (asyncRes.error.message.includes('ENOENT')) {
await options.setupNewConfig();
return Config.save();
}
Printer.printError(asyncRes.error.message);
process.exit(1);
}
const respDataObj = JSON.parse(asyncRes.data.toString('utf-8'));
const [error, data] = parseWithZod(ConfigSchema, respDataObj, 'ConfigFile');
if (error) {
tryUpdateConfig(respDataObj, options.setDefaultProps);
return;
}
_config = data;
}
static save() {
writeFileSync(pathJoin(process.cwd(), _configFileName), JSON.stringify(_config, null, 2));
}
}
async function tryUpdateConfig(partialConfig, setDefaultProps) {
const config = setDefaultProps({ ...partialConfig });
const [error, data] = parseWithZod(ConfigSchema, config, 'ConfigFile');
if (error) {
const header = error.shift();
Printer.printError([...error], header);
process.exit(1);
}
_config = data;
Printer.printWarning('An older version of the Config file has been discovered and updated ' +
'to reflect latest Wakitsu changes.', 'Config Updated');
Config.save();
}
//# sourceMappingURL=config.js.map