@travetto/email
Version:
Email transmission module.
51 lines (43 loc) • 1.34 kB
text/typescript
import mustache from 'mustache';
import { Injectable } from '@travetto/di';
import { EmailResource } from './resource';
/**
* Mail interpolation engine
*
* @concrete ./internal/types:MailInterpolatorTarget
*/
export interface MailInterpolator {
/**
* Resolved nested templates
*/
resolveNested(template: string): Promise<string>;
/**
* Interpolate a string with a given context
*/
render(text: string, ctx: Record<string, unknown>): Promise<string> | string;
}
()
export class MustacheInterpolator implements MailInterpolator {
resources = new EmailResource();
/**
* Resolved nested templates
*/
async resolveNested(template: string): Promise<string> {
const promises: Promise<string>[] = [];
template = template.replace(/[{]{2,3}>\s+(\S+)([.]html)?\s*[}]{2,3}/g, (all: string, name: string) => {
promises.push(
this.resources.read(`${name}.html`) // Ensure html file
.then(contents => this.resolveNested(contents))
);
return `$%${promises.length - 1}%$`;
});
const resolved = await Promise.all(promises);
return template.replace(/[$]%(\d+)%[$]/g, (__, idx) => resolved[+idx]);
}
/**
* Interpolate text with data
*/
render(text: string, data: Record<string, unknown>): string {
return mustache.render(text, data);
}
}