@n0safe/indirectus
Version:
Directus Tools CLI.
228 lines • 7.86 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TemplateLoader = void 0;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const jiti_1 = __importDefault(require("jiti"));
const load = (0, jiti_1.default)(__filename, {
//debug: true,
});
const nunjucks_1 = require("nunjucks");
const grob_1 = require("@wolfpkgs/core/grob");
class TemplateLoader extends nunjucks_1.Loader {
"async" = true;
static "async" = true;
templateName;
localDirs;
projectDirs;
macroDirs;
templatesDirs;
constructor(templateName, projectDirs) {
super();
this.setMaxListeners(1000);
this.templateName = templateName;
this.projectDirs = projectDirs ?? [];
this.macroDirs = this.projectDirs
.map((dir) => path.join(dir, "macros"))
.filter((dir) => fs.existsSync(dir));
this.templatesDirs = this.projectDirs
.map((dir) => path.join(dir, "templates"))
.filter((dir) => fs.existsSync(dir));
this.localDirs = this.projectDirs
.map((dir) => path.join(dir, "templates", templateName))
.filter((dir) => fs.existsSync(dir));
}
getTemplateDirs() {
return this.projectDirs
.map((dir) => path.join(dir, "templates", this.templateName))
.filter((dir) => fs.existsSync(dir))
.map((dir) => path.resolve(dir));
}
getTemplatesDirs() {
return this.projectDirs
.map((dir) => path.join(dir, "templates"))
.filter((dir) => fs.existsSync(dir))
.map((dir) => path.resolve(dir));
}
getMacroDirs() {
return this.projectDirs
.flatMap((dir) => [path.join(dir, "macros")])
.filter((dir) => fs.existsSync(dir));
}
getFilterDirs() {
return this.projectDirs
.flatMap((dir) => [path.join(dir, "extensions/filters")])
.filter((dir) => fs.existsSync(dir));
}
getTagsDirs() {
return this.projectDirs
.flatMap((dir) => [path.join(dir, "extensions/tags")])
.filter((dir) => fs.existsSync(dir));
}
async getFiles() {
const files = [];
for (const root of this.getTemplateDirs()) {
const discovered = await grob_1.grob.glob("**/*.njk", {
cwd: root,
absolute: true,
});
files.push(...discovered
.map((file) => path.relative(root, file))
.map((file) => ({
input: file,
output: file.replace(/.njk$/i, ""),
}))
.filter((file) => {
return file.input != file.output;
})
.map((file) => ({
input: path.join(root, file.input),
output: file.output,
})));
}
return files.map((file) => {
if ('template' in file) {
return file;
}
return {
input: path.resolve(file.input),
output: file.output,
};
});
}
async getFilterFiles() {
const files = [];
for (const dir of this.getFilterDirs()) {
files.push(...(await grob_1.grob.glob("**/*.{ts,mts,cts,js,mjs,cjs}", {
cwd: dir,
ignore: ["**/*.d.ts"],
}))
.filter((name, _, files) => {
if (name.endsWith("js")) {
return files.indexOf(name.replace(/js$/i, "ts")) < 0;
}
return true;
})
.map((name) => path.join(dir, name)));
}
return files;
}
async getFilters() {
const files = await this.getFilterFiles();
const filters = {};
for (const file of files) {
const filter = load(file);
if (typeof filter === "object") {
Object.assign(filters, filter);
}
}
return filters;
}
async getSource(name, callback) {
let type = "template";
let request = name;
if (name.indexOf(":") > 0) {
if (!fs.existsSync(name)) {
const parts = name.split(":", 2);
type = parts[0];
request = parts.slice(1)[0];
}
}
let searchPaths = [];
let fullpath = null;
if (type == "default") {
searchPaths = this.getTemplateDirs();
}
else if (type == "template") {
searchPaths = this.getTemplatesDirs();
}
else if (type == "macro") {
searchPaths = this.macroDirs;
}
else if (type == "module") {
try {
fullpath = require.resolve(request);
}
catch (err) {
try {
fullpath = await Promise.resolve(`${request}`).then(s => __importStar(require(s)));
}
catch (err) {
fullpath = null;
}
}
}
if (!fullpath && searchPaths.length) {
for (const searchDir of searchPaths) {
const basePath = path.resolve(searchDir);
const candidates = [
path.resolve(searchDir, request),
path.resolve(searchDir, `${request}.njk`),
];
for (const candidate of candidates) {
if (candidate.indexOf(basePath) === 0 && fs.existsSync(candidate)) {
fullpath = candidate;
break;
}
}
if (fullpath) {
break;
}
}
}
if (!fullpath) {
try {
}
catch (err) { }
}
if (!fullpath) {
callback(new Error("Template not found"), null);
return;
}
const source = {
src: fs.readFileSync(fullpath, "utf-8"),
path: fullpath,
noCache: true,
};
this.emit("load", name, source);
callback(null, source);
}
}
exports.TemplateLoader = TemplateLoader;
//# sourceMappingURL=template-loader.js.map