const Helper = require("./Helper") const { SafeString } = require("handlebars") const externalHandlebars = require("./external") const { processJS } = require("./javascript") const { HelperFunctionNames, HelperFunctionBuiltin, LITERAL_MARKER, } = require("./constants") const HTML_SWAPS = { "<": "<", ">": ">", } const HELPERS = [ // external helpers new Helper(HelperFunctionNames.OBJECT, value => { return new SafeString(JSON.stringify(value)) }), // javascript helper new Helper(HelperFunctionNames.JS, processJS), // this help is applied to all statements new Helper(HelperFunctionNames.ALL, value => { if ( value != null && typeof value === "object" && value.toString() === "[object Object]" ) { return new SafeString(JSON.stringify(value)) } // null/undefined values produce bad results if (value == null || typeof value !== "string") { return value || "" } if (value && value.string) { value = value.string } let text = new SafeString(value.replace(/&/g, "&")) if (text == null || typeof text !== "string") { return text } return text.replace(/[<>]/g, tag => { return HTML_SWAPS[tag] || tag }) }), // adds a note for post-processor new Helper(HelperFunctionNames.LITERAL, value => { const type = typeof value const outputVal = type === "object" ? JSON.stringify(value) : value return `{{${LITERAL_MARKER} ${type}-${outputVal}}}` }), ] module.exports.HelperNames = () => { return Object.values(HelperFunctionNames).concat( HelperFunctionBuiltin, externalHandlebars.externalHelperNames ) } module.exports.registerAll = handlebars => { for (let helper of HELPERS) { helper.register(handlebars) } // register imported helpers externalHandlebars.registerAll(handlebars) } module.exports.unregisterAll = handlebars => { for (let helper of HELPERS) { helper.unregister(handlebars) } // unregister all imported helpers externalHandlebars.unregisterAll(handlebars) }