zulip/frontend_tests/zjsunit/handlebars.js

62 lines
2.0 KiB
JavaScript

"use strict";
const fs = require("fs");
const path = require("path");
const Handlebars = require("handlebars");
const {SourceMapConsumer, SourceNode} = require("source-map");
const templates_path = path.resolve(__dirname, "../../static/templates");
exports.stub_templates = (stub) => {
window.template_stub = stub;
};
const hb = Handlebars.create();
class ZJavaScriptCompiler extends hb.JavaScriptCompiler {
nameLookup(parent, name, type) {
// Auto-register partials with relative paths, like handlebars-loader.
if (type === "partial" && name !== "@partial-block") {
const filename = path.resolve(path.dirname(this.options.srcName), name + ".hbs");
return ["require(", JSON.stringify(filename), ")"];
}
return super.nameLookup(parent, name, type);
}
}
ZJavaScriptCompiler.prototype.compiler = ZJavaScriptCompiler;
hb.JavaScriptCompiler = ZJavaScriptCompiler;
function compile_hbs(module, filename) {
const code = fs.readFileSync(filename, "utf-8");
const name = path.relative(templates_path, filename).slice(0, -".hbs".length);
const pc = hb.precompile(code, {preventIndent: true, srcName: filename});
const node = new SourceNode();
node.add([
'const Handlebars = require("handlebars/runtime");\n',
"const template = Handlebars.template(",
SourceNode.fromStringWithSourceMap(pc.code, new SourceMapConsumer(pc.map)),
");\n",
"module.exports = (...args) => {\n",
" if (window.template_stub !== undefined) {\n",
" return window.template_stub(",
JSON.stringify(name),
", ...args);\n",
" }\n",
" return template(...args);\n",
"};\n",
]);
const out = node.toStringWithSourceMap();
module._compile(
out.code +
"\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," +
Buffer.from(out.map.toString()).toString("base64"),
filename,
);
}
exports.hook_require = () => {
require.extensions[".hbs"] = compile_hbs;
};