import { existsSync, readFileSync, writeFileSync, mkdirpSync } from "fs-extra"; import { dirname } from "path"; export default class FileBasedMap extends Map { constructor(private filePath: string) { super() this.load() } private load() { super.clear() // clear in-memory map if (existsSync(this.filePath) === false) { mkdirpSync(dirname(this.filePath)) writeFileSync(this.filePath, "{}") } const content = readFileSync(this.filePath) const data: { [key: string]: T } = JSON.parse(content.toString()) // load into the map Object.keys(data).forEach((key) => super.set(key, data[key])) } private dump() { const data = Array.from(super.keys()).reduce((data, key) => { data[key] = super.get(key) return data }, {} as any); writeFileSync(this.filePath, JSON.stringify(data, null, 4)) } set(key: string, value: T) { super.set(key, value) this.dump() return this } clear() { super.clear() this.dump() } delete(key: string): boolean { const deleted = super.delete(key) if (deleted) this.dump() return deleted } }