// // util.js — configuration, logging and the small filesystem helpers the rest // of the extension leans on. // // Nova's fs API is deliberately thin: mkdir is not recursive, copy refuses to // overwrite, and stat returns null rather than throwing. Everything here exists // to paper over one of those. // /** Reads an extension preference, falling back to `fallback` when unset. */ function conf(key, fallback) { const value = nova.workspace.config.get(key) ?? nova.config.get(key); return value === null || value === undefined || value === "" ? fallback : value; } function log(...args) { console.log(...args); } function warn(...args) { console.warn(...args); } /** True when a file or directory exists at `path`. */ function exists(path) { return nova.fs.access(path, nova.fs.F_OK); } /** Creates `path` and any missing parents. */ function mkdirp(path) { if (exists(path)) return; const parent = nova.path.dirname(path); if (parent && parent !== path) mkdirp(parent); nova.fs.mkdir(path); } /** Writes `contents` to `path`, replacing whatever was there. */ function writeFile(path, contents) { mkdirp(nova.path.dirname(path)); const file = nova.fs.open(path, "w"); try { file.write(contents); } finally { file.close(); } } /** Copies `src` over `dest`, which nova.fs.copy on its own refuses to do. */ function copyFile(src, dest) { mkdirp(nova.path.dirname(dest)); if (exists(dest)) nova.fs.remove(dest); nova.fs.copy(src, dest); } /** Removes a directory and everything in it. */ function removeTree(path) { if (!exists(path)) return; const stats = nova.fs.stat(path); if (stats && stats.isDirectory()) { for (const entry of nova.fs.listdir(path)) { removeTree(nova.path.join(path, entry)); } nova.fs.rmdir(path); } else { nova.fs.remove(path); } } /** * FNV-1a, as an 8-character hex string. Used to keep the generated filename for * two same-named Markdown files in different folders from colliding. */ function shortHash(text) { let hash = 0x811c9dc5; for (let i = 0; i < text.length; i++) { hash ^= text.charCodeAt(i); hash = Math.imul(hash, 0x01000193) >>> 0; } return hash.toString(16).padStart(8, "0"); } module.exports = { conf, log, warn, exists, mkdirp, writeFile, copyFile, removeTree, shortHash };