UNPKG

trash-cleaner

Version:

Finds and deletes trash email in the mailbox

82 lines (70 loc) 2.57 kB
import path from 'path'; import fs from 'fs'; import { promisify } from 'util'; import yaml from 'js-yaml'; import { ConfigStore } from './config-store.js'; const fsExists = promisify(fs.exists); const fsReadFile = promisify(fs.readFile); const fsWriteFile = promisify(fs.writeFile); /** * A class to store and retrieve configuration objects in the file system. */ class FileSystemConfigStore extends ConfigStore { readonly configDirPath: string; /** * Creates an instance of ConfigStore. */ constructor(configDirPath: string) { super(); this.configDirPath = configDirPath; if (!fs.existsSync(configDirPath)) { throw new Error(`Config directory not found: ${configDirPath}\nRun 'trash-cleaner init' to create it with sample configuration files.`); } } /** * Reads the configuration object from the store. * For .yaml/.yml keys, parses as YAML. * For .json keys, tries .yaml first (backward compat), then falls back to .json. */ async getJson(key: string): Promise<unknown> { if (key.endsWith('.yaml') || key.endsWith('.yml')) { const value = await this.get(key); if (value === null) return null; return yaml.load(value.toString()); } // For .json keys: try .yaml equivalent first, fall back to .json const yamlKey = key.replace(/\.json$/, '.yaml'); const yamlPath = path.join(this.configDirPath, yamlKey); if (await fsExists(yamlPath)) { const value = await fsReadFile(yamlPath); return yaml.load(value.toString()); } const value = await this.get(key); if (value === null) return null; return JSON.parse(value.toString()); } /** * Reads the configuration string from the store. */ async get(key: string): Promise<Buffer | null> { const configPath = path.join(this.configDirPath, key); if (!await fsExists(configPath)) { return null; } return await fsReadFile(configPath); } /** * Writes the configuration object to the store as JSON. */ putJson(key: string, value: object): Promise<void> { return this.put(key, JSON.stringify(value)); } /** * Writes the configuration string to the store. */ async put(key: string, value: string): Promise<void> { const configPath = path.join(this.configDirPath, key); await fsWriteFile(configPath, value); } } export { FileSystemConfigStore };