105 lines
2.6 KiB
JavaScript
105 lines
2.6 KiB
JavaScript
import { TemplatePath } from "@11ty/eleventy-utils";
|
|
|
|
import eventBus from "./EventBus.js";
|
|
|
|
// Note: this is only used for TemplateLayout right now but could be used for more
|
|
// Just be careful because right now the TemplateLayout cache keys are not directly mapped to paths
|
|
// So you may get collisions if you use this for other things.
|
|
class TemplateCache {
|
|
constructor() {
|
|
this.cache = {};
|
|
this.cacheByInputPath = {};
|
|
}
|
|
|
|
clear() {
|
|
this.cache = {};
|
|
this.cacheByInputPath = {};
|
|
}
|
|
|
|
// alias
|
|
removeAll() {
|
|
this.clear();
|
|
}
|
|
|
|
size() {
|
|
return Object.keys(this.cacheByInputPath).length;
|
|
}
|
|
|
|
add(layoutTemplate) {
|
|
let keys = new Set();
|
|
|
|
if (typeof layoutTemplate === "string") {
|
|
throw new Error(
|
|
"Invalid argument type passed to TemplateCache->add(). Should be a TemplateLayout.",
|
|
);
|
|
}
|
|
|
|
if ("getFullKey" in layoutTemplate) {
|
|
keys.add(layoutTemplate.getFullKey());
|
|
}
|
|
|
|
if ("getKey" in layoutTemplate) {
|
|
// if `key` was an alias, also set to the pathed layout value too
|
|
// e.g. `layout: "default"` and `layout: "default.liquid"` will both map to the same template.
|
|
keys.add(layoutTemplate.getKey());
|
|
}
|
|
|
|
for (let key of keys) {
|
|
this.cache[key] = layoutTemplate;
|
|
}
|
|
|
|
// also the full template input path for use with eleventy --serve/--watch e.g. `_includes/default.liquid` (see `remove` below)
|
|
let fullPath = TemplatePath.stripLeadingDotSlash(layoutTemplate.inputPath);
|
|
this.cacheByInputPath[fullPath] = layoutTemplate;
|
|
}
|
|
|
|
has(key) {
|
|
return key in this.cache;
|
|
}
|
|
|
|
get(key) {
|
|
if (!this.has(key)) {
|
|
throw new Error(`Could not find ${key} in TemplateCache.`);
|
|
}
|
|
|
|
return this.cache[key];
|
|
}
|
|
|
|
remove(layoutFilePath) {
|
|
layoutFilePath = TemplatePath.stripLeadingDotSlash(layoutFilePath);
|
|
if (!this.cacheByInputPath[layoutFilePath]) {
|
|
// not a layout file
|
|
return;
|
|
}
|
|
|
|
let layoutTemplate = this.cacheByInputPath[layoutFilePath];
|
|
layoutTemplate.resetCaches();
|
|
|
|
let keys = layoutTemplate.getCacheKeys();
|
|
for (let key of keys) {
|
|
delete this.cache[key];
|
|
}
|
|
|
|
delete this.cacheByInputPath[layoutFilePath];
|
|
}
|
|
}
|
|
|
|
let layoutCache = new TemplateCache();
|
|
|
|
eventBus.on("eleventy.resourceModified", (path, usedBy, metadata = {}) => {
|
|
// https://github.com/11ty/eleventy-plugin-bundle/issues/10
|
|
if (metadata.viaConfigReset) {
|
|
layoutCache.removeAll();
|
|
} else if (metadata.relevantLayouts?.length) {
|
|
// reset the appropriate layouts relevant to the file.
|
|
for (let layoutPath of metadata.relevantLayouts || []) {
|
|
layoutCache.remove(layoutPath);
|
|
}
|
|
} else {
|
|
layoutCache.remove(path);
|
|
}
|
|
});
|
|
|
|
// singleton
|
|
export default layoutCache;
|