@nitrogenbuilder/client-core
Version:
Nitrogen Builder Core Client
49 lines (43 loc) • 1.38 kB
text/typescript
import { applyFilters } from './templateFilters.js';
import type { ParsedSegmentPart } from './parseTemplateExpression.js';
import { parseSegment } from './parseTemplateExpression.js';
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 '';
});
}