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
JavaScript
;
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