63 lines
1.1 KiB
JavaScript
63 lines
1.1 KiB
JavaScript
import fs from "node:fs";
|
|
import { TemplatePath } from "@11ty/eleventy-utils";
|
|
|
|
// Checks both files and directories
|
|
class ExistsCache {
|
|
#exists = new Map();
|
|
#dirs = new Map();
|
|
|
|
constructor() {
|
|
this.lookupCount = 0;
|
|
}
|
|
|
|
get size() {
|
|
return this.#exists.size;
|
|
}
|
|
|
|
has(path) {
|
|
return this.#exists.has(path);
|
|
}
|
|
|
|
set(path, isExist) {
|
|
this.#exists.set(TemplatePath.addLeadingDotSlash(path), Boolean(isExist));
|
|
}
|
|
|
|
// Not yet needed
|
|
// setDirectory(path, isExist) {}
|
|
|
|
// Relative paths (to root directory) expected (but not enforced due to perf costs)
|
|
exists(path) {
|
|
if (!this.#exists.has(path)) {
|
|
let exists = fs.existsSync(path);
|
|
this.lookupCount++;
|
|
|
|
// mark for next time
|
|
this.#exists.set(path, Boolean(exists));
|
|
|
|
return exists;
|
|
}
|
|
|
|
return this.#exists.get(path);
|
|
}
|
|
|
|
isDirectory(path) {
|
|
if (!this.exists(path)) {
|
|
return false;
|
|
}
|
|
|
|
if (!this.#dirs.has(path)) {
|
|
let isDir = fs.statSync(path).isDirectory();
|
|
this.lookupCount++;
|
|
|
|
// mark for next time
|
|
this.#dirs.set(path, isDir);
|
|
|
|
return isDir;
|
|
}
|
|
|
|
return this.#dirs.get(path);
|
|
}
|
|
}
|
|
|
|
export default ExistsCache;
|