UNPKG

@n0safe/indirectus

Version:
228 lines 7.86 kB
"use strict"; 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