import { uniq } from '../utils/uniq'; import type { HoganHelpers, Templates } from '../../types'; import type { HoganOptions } from 'hogan.js'; type TemplatesConfig = { helpers?: HoganHelpers; compileOptions?: HoganOptions; }; export type PreparedTemplateProps = { templatesConfig: TemplatesConfig; templates: TTemplates; useCustomCompileOptions: { [TKey in keyof Partial]: boolean; }; }; function prepareTemplates( // can not use = {} here, since the template could have different constraints defaultTemplates?: TTemplates, templates: Partial = {} ) { const allKeys = uniq([ ...Object.keys(defaultTemplates || {}), ...Object.keys(templates), ]); return allKeys.reduce( (config, key: keyof TTemplates) => { const defaultTemplate = defaultTemplates ? defaultTemplates[key] : undefined; const customTemplate = templates[key]; const isCustomTemplate = customTemplate !== undefined && customTemplate !== defaultTemplate; config.templates[key] = isCustomTemplate ? customTemplate! // typescript doesn't recognize that this condition asserts customTemplate is defined : defaultTemplate!; config.useCustomCompileOptions[key] = isCustomTemplate; return config; }, { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions templates: {} as TTemplates, // eslint-disable-next-line @typescript-eslint/consistent-type-assertions useCustomCompileOptions: {} as { [TKey in keyof TTemplates]: boolean; }, } ); } /** * Prepares an object to be passed to the Template widget */ export function prepareTemplateProps({ defaultTemplates, templates, templatesConfig, }: { defaultTemplates: TTemplates; templates?: Partial; templatesConfig: TemplatesConfig; }): PreparedTemplateProps { const preparedTemplates = prepareTemplates(defaultTemplates, templates); return { templatesConfig, ...preparedTemplates, }; }