/* eslint-disable tsdoc/syntax */ // tsdoc/syntax cannot handle `@range` import type { TemplateDelegate } from 'handlebars'; import { compile } from 'handlebars'; import type { TemplateEngine, Template } from './TemplateEngine'; import { readTemplate } from './TemplateEngine'; import Dict = NodeJS.Dict; /** * Fills in Handlebars templates. */ export class HandlebarsTemplateEngine = Dict> implements TemplateEngine { private readonly applyTemplate: Promise; /** * @param template - The default template @range {json} */ public constructor(template?: Template) { this.applyTemplate = readTemplate(template) .then((templateString: string): TemplateDelegate => compile(templateString)); } public async render(contents: T): Promise; public async render(contents: TCustom, template: Template): Promise; public async render(contents: TCustom, template?: Template): Promise { const applyTemplate = template ? compile(await readTemplate(template)) : await this.applyTemplate; return applyTemplate(contents); } }