diff --git a/src/utils/templateUtils.ts b/src/utils/templateUtils.ts new file mode 100644 index 0000000..aea3f64 --- /dev/null +++ b/src/utils/templateUtils.ts @@ -0,0 +1,94 @@ +import * as path from 'path'; +import * as fs from 'fs-extra'; +import { Layout, Template, TemplateVariable } from '../models/types'; + +export class TemplateUtils { + private readonly variablePattern = /\$\{([^}]+)\}/g; + + extractVariables(template: Template): string[] { + const variables: string[] = []; + const layoutJson = JSON.stringify(template.layout); + + let match: RegExpExecArray | null; + while ((match = this.variablePattern.exec(layoutJson)) !== null) { + if (!variables.includes(match[1])) { + variables.push(match[1]); + } + } + + return variables; + } + + substituteVariables(layout: Layout, variables: Record): Layout { + const layoutStr = JSON.stringify(layout); + let substituted = layoutStr; + + for (const [key, value] of Object.entries(variables)) { + const patterns = [`\\$\\{${key}\\}`, `\\$\\{${key}:([^}]*)\\}`]; + for (const pattern of patterns) { + substituted = substituted.replace(new RegExp(pattern, 'g'), value); + } + } + + return JSON.parse(substituted) as Layout; + } + + async createTemplateFromLayout( + name: string, + displayName: string, + description: string, + layout: Layout, + variableDefaults?: Record + ): Promise