import { applyFilters, parseSegment } from '@nitrogenbuilder/client-core'; import type { ParsedSegmentPart } from '@nitrogenbuilder/client-core'; import { resolve } from './resolve.js'; function isEmpty(value: unknown): boolean { return value === null || value === undefined || value === ''; } function evaluateSegment(segment: string, context: any): unknown { const parsed = parseSegment(segment); const results = parsed.parts.map((part: ParsedSegmentPart) => { let value: unknown; if (part.type === 'literal') { value = part.value; } else { value = resolve(part.value, context); } if (part.filters.length > 0 && value != null) { value = applyFilters(value, part.filters); } return value; }); if (results.length === 1) return results[0]; if (results.some((r: unknown) => r === null || r === undefined)) return ''; return results.map(String).join(''); } export function renderTemplate( str: string, context: any, builderMode?: boolean ) { if (typeof str !== 'string') return str; return str.replace(/{{\s*([^}]+)\s*}}/g, (_, raw: string) => { const segments = raw.split('||'); for (const segment of segments) { const value = evaluateSegment(segment, context); if (!isEmpty(value)) { const resolved = String(value); return builderMode ? resolved : resolved; } } return ''; }); }