marko
Version:
UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.
53 lines (44 loc) • 1.28 kB
JavaScript
import { normalizeTemplateString } from "@marko/compiler/babel-utils";
const mergeWriteCallsVisitor = {
ExpressionStatement(path) {
let curPath = path;
const quasis = [""];
const expressions = [];
const removals = [];
do {
const content = getOutContent(curPath);
if (!content) break;
if (curPath !== path) removals.push(curPath);
quasis.push("");
expressions.push(content);
} while ((curPath = curPath.getNextSibling()));
removals.forEach((removal) => removal.remove());
if (expressions.length > 1) {
path
.get("expression.arguments.0")
.replaceWith(normalizeTemplateString(quasis, ...expressions));
}
},
};
export function optimizeHTMLWrites(path) {
const {
hub: {
file: { markoOpts },
},
} = path;
if (markoOpts.optimize && markoOpts.output === "html") {
path.traverse(mergeWriteCallsVisitor);
}
}
function getOutContent(path) {
if (path.isExpressionStatement()) {
return getOutContent(path.get("expression"));
}
return (
path.isCallExpression() &&
path.get("callee").isMemberExpression() &&
path.get("callee.object.name").node === "out" &&
path.get("callee.property.name").node === "w" &&
path.get("arguments.0").node
);
}