Instantly share code, notes, and snippets.

Embed
What would you like to do?
var Hogan = require('./twitter-hogan');
var renderOptions = { asString: true, sectionTags: [{ o: '_i', c: 'i' }] };
var translateMustache = require('./translate-mustache');
function extractPartials(tmpl) {
// need eval to pull the partials out of the Hogan-generated string
/* eslint-disable no-eval */
var hoganParams = eval(`(${tmpl})`);
/* eslint-enable no-eval */
var partialNames = [];
for (var key in hoganParams.partials) {
partialNames.push(hoganParams.partials[key].name);
}
return partialNames;
}
// templates/client is specified in resolve.config
function partialPath(name) {
return `${name}.mustache`;
}
function templateModuleWithoutPartials(tmpl) {
return `module.exports = new Hogan.Template(${tmpl});`;
}
function templateModuleWithPartials(tmpl, partialNames) {
var dependencies = partialNames.map((name) =>
`'${name}': require('${partialPath(name)}')`
).join(',\n');
// Hogan is injected by ProvidePlugin
return `
var mergeTemplates = require('app/utils/merge_templates');
var dependencies = {
${dependencies}
};
var defaultPartials = mergeTemplates(dependencies);
var template = new Hogan.Template(${tmpl});
function render(context, partials, indent) {
partials = partials || {};
for (var key in defaultPartials) {
if (!partials[key]) {
partials[key] = defaultPartials[key];
}
}
return template.render(context, partials, indent);
};
module.exports = {
template: template,
partials: defaultPartials,
render: render
}
`;
}
module.exports = function(source) {
var phrases = this.options.phrases || {};
this.cacheable();
var translatedSource = translateMustache(source, phrases);
var tmpl = Hogan.compile(translatedSource, renderOptions);
var partialNames = extractPartials(tmpl);
if (!partialNames.length) {
return templateModuleWithoutPartials(tmpl);
} else {
return templateModuleWithPartials(tmpl, partialNames);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment