import fs from 'fs'; import $ from './lib'; const Storage = { read(header: string): object { this.open('data'); const path = `data/${header}.json`; let data = {}; if (fs.existsSync(path)) { const file = fs.readFileSync(path, 'utf-8'); try { data = JSON.parse(file); } catch (error) { if (process.argv[2] !== 'dev') { $.warn( `Malformed JSON data (header: ${header}), backing it up.`, file, ); fs.writeFile( `${path}.backup`, file, generateHandler( `Backup file of "${header}" successfully written as ${file}.`, ), ); } } } return data; }, write(header: string, data: object, asynchronous = true) { this.open('data'); const path = `data/${header}.json`; if (process.argv[2] === 'dev' || header === 'config') { const result = JSON.stringify(data, null, '\t'); if (asynchronous) fs.writeFile( path, result, generateHandler(`"${header}" sucessfully spaced and written.`), ); else fs.writeFileSync(path, result); } else { const result = JSON.stringify(data); if (asynchronous) fs.writeFile( path, result, generateHandler(`"${header}" sucessfully written.`), ); else fs.writeFileSync(path, result); } }, open( path: string, filter?: (value: string, index: number, array: string[]) => unknown, ): string[] { if (!fs.existsSync(path)) fs.mkdirSync(path); let directory = fs.readdirSync(path); if (filter) directory = directory.filter(filter); return directory; }, close(path: string) { if (fs.existsSync(path) && fs.readdirSync(path).length === 0) fs.rmdir(path, generateHandler(`"${path}" successfully closed.`)); }, }; export function generateHandler(message: string) { return (error: Error | null) => { if (error) $.error(error); else $.debug(message); }; } export default Storage;