@marko/compiler
Version:
Marko template to JS compiler.
56 lines (49 loc) • 1.86 kB
JavaScript
;exports.__esModule = true;exports.normalizeTemplateString = normalizeTemplateString;var _compiler = require("@marko/compiler");
var _jsesc = _interopRequireDefault(require("jsesc"));function _interopRequireDefault(e) {return e && e.__esModule ? e : { default: e };}
function normalizeTemplateString(quasis, ...expressions) {
quasis = quasis.map((q) => _compiler.types.isTemplateElement(q) ? q.value.cooked : q);
for (let i = expressions.length; i--;) {
let v = expressions[i];
if (_compiler.types.isTemplateLiteral(v)) {
quasis[i] += v.quasis[0].value.cooked;
quasis[i + 1] =
v.quasis[v.quasis.length - 1].value.cooked + (quasis[i + 1] || "");
quasis.splice(
i + 1,
0,
...v.quasis.slice(1, -1).map((q) => q.value.cooked)
);
expressions.splice(i, 1, ...v.expressions);
i += v.expressions.length;
} else if (_compiler.types.isStringLiteral(v) || typeof v === "string") {
const value = _compiler.types.isStringLiteral(v) ? v.value : v;
quasis[i] += value + quasis[i + 1];
expressions.splice(i, 1);
quasis.splice(i + 1, 1);
}
}
if (!expressions.length) {
// No expression, just return a literal or empty.
const literal = quasis.join("");
return literal === "" ? undefined : _compiler.types.stringLiteral(literal);
}
if (
expressions.length === 1 &&
quasis.length === 2 &&
quasis.every(isEmptyString))
{
// Only expression `${expr}` just return the expr.
return expressions[0];
}
// Do it.
return _compiler.types.templateLiteral(quasis.map(getTemplateElement), expressions);
}
function getTemplateElement(s = "") {
return _compiler.types.templateElement({
cooked: s,
raw: (0, _jsesc.default)(s, { quotes: "backtick" })
});
}
function isEmptyString(s = "") {
return s === "";
}