82 lines
1.8 KiB
JavaScript
Executable File
82 lines
1.8 KiB
JavaScript
Executable File
import { TemplatePath } from "@11ty/eleventy-utils";
|
|
|
|
import TemplateData from "./Data/TemplateData.js";
|
|
import Sortable from "./Util/Objects/Sortable.js";
|
|
import { isGlobMatch } from "./Util/GlobMatcher.js";
|
|
|
|
class TemplateCollection extends Sortable {
|
|
constructor() {
|
|
super();
|
|
|
|
this._filteredByGlobsCache = new Map();
|
|
}
|
|
|
|
getAll() {
|
|
return this.items.slice();
|
|
}
|
|
|
|
getAllSorted() {
|
|
return this.sort(Sortable.sortFunctionDateInputPath);
|
|
}
|
|
|
|
getSortedByDate() {
|
|
return this.sort(Sortable.sortFunctionDate);
|
|
}
|
|
|
|
getGlobs(globs) {
|
|
if (typeof globs === "string") {
|
|
globs = [globs];
|
|
}
|
|
|
|
globs = globs.map((glob) => TemplatePath.addLeadingDotSlash(glob));
|
|
|
|
return globs;
|
|
}
|
|
|
|
getFilteredByGlob(globs) {
|
|
globs = this.getGlobs(globs);
|
|
|
|
let key = globs.join("::");
|
|
if (!this._dirty) {
|
|
// Try to find a pre-sorted list and clone it.
|
|
if (this._filteredByGlobsCache.has(key)) {
|
|
return [...this._filteredByGlobsCache.get(key)];
|
|
}
|
|
} else if (this._filteredByGlobsCache.size) {
|
|
// Blow away cache
|
|
this._filteredByGlobsCache = new Map();
|
|
}
|
|
|
|
let filtered = this.getAllSorted().filter((item) => {
|
|
return isGlobMatch(item.inputPath, globs);
|
|
});
|
|
this._dirty = false;
|
|
this._filteredByGlobsCache.set(key, [...filtered]);
|
|
return filtered;
|
|
}
|
|
|
|
getFilteredByTag(tagName) {
|
|
return this.getAllSorted().filter((item) => {
|
|
if (!tagName || TemplateData.getIncludedTagNames(item.data).includes(tagName)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
getFilteredByTags(...tags) {
|
|
return this.getAllSorted().filter((item) => {
|
|
let itemTags = TemplateData.getIncludedTagNames(item.data);
|
|
return tags.every((requiredTag) => {
|
|
if (Array.isArray(itemTags)) {
|
|
return itemTags.includes(requiredTag);
|
|
} else {
|
|
return itemTags === requiredTag;
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
export default TemplateCollection;
|