UNPKG

gather-ts

Version:

A powerful code analysis and packaging tool designed for creating AI-friendly code representations for javascript and typescript projects.

101 lines 3.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TemplateManager = void 0; // src/core/templating/TemplateManager.ts const errors_1 = require("@/errors"); const services_1 = require("@/types/services"); class TemplateManager extends services_1.BaseService { constructor(deps, options = {}) { super(); this.deps = deps; this.templates = new Map(); this.debug = options.debug || false; } async initialize() { await super.initialize(); this.logDebug("Initializing TemplateManager"); } cleanup() { this.logDebug("Cleaning up TemplateManager"); this.templates.clear(); super.cleanup(); } logDebug(message) { if (this.debug) { this.deps.logger.debug(`[TemplateManager] ${message}`); } } registerTemplate(template) { this.checkInitialized(); if (this.templates.has(template.id)) { throw new errors_1.ValidationError(`Template with ID ${template.id} already exists`); } this.validateTemplate(template); this.templates.set(template.id, template); this.logDebug(`Registered template: ${template.id}`); } getTemplate(id) { this.checkInitialized(); const template = this.templates.get(id); if (!template) { throw new errors_1.ValidationError(`Template with ID ${id} not found`); } return template; } hasTemplate(id) { return this.templates.has(id); } render(templateId, context) { this.checkInitialized(); const template = this.getTemplate(templateId); this.validateContext(template, context); const fullContext = this.applyDefaults(template, context); const result = this.renderTemplate(template.content, fullContext); this.logDebug(`Rendered template: ${templateId}`); return result; } validateTemplate(template) { if (!template.id || !template.content) { throw new errors_1.ValidationError("Template must have id and content"); } const declaredVars = new Set(template.variables.map((v) => v.name)); const usedVars = this.extractVariables(template.content); const undeclaredVars = [...usedVars].filter((v) => !declaredVars.has(v)); if (undeclaredVars.length > 0) { throw new errors_1.ValidationError(`Template contains undeclared variables: ${undeclaredVars.join(", ")}`); } } validateContext(template, context) { const requiredVars = template.variables.filter((v) => v.required); for (const variable of requiredVars) { if (!(variable.name in context)) { throw new errors_1.ValidationError(`Missing required variable: ${variable.name}`); } } } applyDefaults(template, context) { const result = { ...context }; for (const variable of template.variables) { if (!(variable.name in result) && variable.defaultValue !== undefined) { result[variable.name] = variable.defaultValue; } } return result; } extractVariables(content) { const varRegex = /\{\{([\w.-]+)\}\}/g; const variables = new Set(); let match; while ((match = varRegex.exec(content)) !== null) { variables.add(match[1]); } return variables; } renderTemplate(content, context) { return content.replace(/\{\{([\w.-]+)\}\}/g, (_, key) => { return context[key] || ""; }); } } exports.TemplateManager = TemplateManager; //# sourceMappingURL=TemplateManager.js.map