78 lines
1.8 KiB
JavaScript
78 lines
1.8 KiB
JavaScript
import dget from "dlv";
|
|
import { dset } from "dset";
|
|
import fs from "node:fs";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
import process from "node:process";
|
|
function getConfigDir(name) {
|
|
const homedir = os.homedir();
|
|
const macos = () => path.join(homedir, "Library", "Preferences", name);
|
|
const win = () => {
|
|
const { APPDATA = path.join(homedir, "AppData", "Roaming") } = process.env;
|
|
return path.join(APPDATA, name, "Config");
|
|
};
|
|
const linux = () => {
|
|
const { XDG_CONFIG_HOME = path.join(homedir, ".config") } = process.env;
|
|
return path.join(XDG_CONFIG_HOME, name);
|
|
};
|
|
switch (process.platform) {
|
|
case "darwin":
|
|
return macos();
|
|
case "win32":
|
|
return win();
|
|
default:
|
|
return linux();
|
|
}
|
|
}
|
|
class GlobalConfig {
|
|
constructor(project) {
|
|
this.project = project;
|
|
this.dir = getConfigDir(this.project.name);
|
|
this.file = path.join(this.dir, "config.json");
|
|
}
|
|
get store() {
|
|
if (this._store)
|
|
return this._store;
|
|
this.ensureDir();
|
|
if (fs.existsSync(this.file)) {
|
|
this._store = JSON.parse(fs.readFileSync(this.file).toString());
|
|
} else {
|
|
const store = {};
|
|
this._store = store;
|
|
this.write();
|
|
}
|
|
return this._store;
|
|
}
|
|
set store(value) {
|
|
this._store = value;
|
|
this.write();
|
|
}
|
|
ensureDir() {
|
|
fs.mkdirSync(this.dir, { recursive: true });
|
|
}
|
|
write() {
|
|
fs.writeFileSync(this.file, JSON.stringify(this.store, null, " "));
|
|
}
|
|
clear() {
|
|
this.store = {};
|
|
fs.rmSync(this.file, { recursive: true });
|
|
}
|
|
delete(key) {
|
|
dset(this.store, key, void 0);
|
|
this.write();
|
|
return true;
|
|
}
|
|
get(key) {
|
|
return dget(this.store, key);
|
|
}
|
|
has(key) {
|
|
return typeof this.get(key) !== "undefined";
|
|
}
|
|
set(key, value) {
|
|
dset(this.store, key, value);
|
|
this.write();
|
|
}
|
|
}
|
|
export {
|
|
GlobalConfig
|
|
};
|