marko-widgets
Version:
<h1 align="center"> <!-- Logo --> <br/> marko-widgets@8 <br/>
50 lines (48 loc) • 1.55 kB
JavaScript
// packages/marko-widgets/src/translate/optmize-html-writes.ts
import { normalizeTemplateString } from "@marko/babel-utils";
var mergeWriteCallsVisitor = {
// Merges any two or more consecutive out.write calls.
ExpressionStatement(expr) {
const firstContent = getOutContent(expr);
if (!firstContent) return;
let curExpr = expr.getNextSibling();
if (!curExpr) return;
const secondContent = getOutContent(curExpr);
if (!secondContent) return;
const quasis = ["", "", ""];
const expressions = [firstContent, secondContent];
let nextExpr = curExpr;
while (nextExpr = curExpr.getNextSibling()) {
curExpr.remove();
const nextContent = getOutContent(nextExpr);
if (!nextContent) break;
quasis.push("");
expressions.push(nextContent);
curExpr = nextExpr;
}
expr.get("expression").get("arguments")[0].replaceWith(normalizeTemplateString(quasis, ...expressions));
}
};
function optimizeHTMLWrites(program) {
const {
hub: {
file: { markoOpts }
}
} = program;
if (markoOpts.optimize && markoOpts.output === "html") {
program.traverse(mergeWriteCallsVisitor);
}
}
function getOutContent(path) {
let { node } = path;
if (!node) return;
if (node.type === "ExpressionStatement") {
node = node.expression;
}
if (node.type === "CallExpression" && node.callee.type === "MemberExpression" && node.callee.object.type === "Identifier" && node.callee.object.name === "out") {
return node.arguments[0];
}
}
export {
optimizeHTMLWrites
};