UNPKG

marko-widgets

Version:

<h1 align="center"> <!-- Logo --> <br/> marko-widgets@8 <br/>

50 lines (48 loc) 1.55 kB
// 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 };