babel-plugin-string-minify
Version:
Remove indentation from multiline template strings
76 lines (60 loc) • 1.91 kB
JavaScript
;
module.exports = function babelPluginminify(babel) {
var t = babel.types;
return {
visitor: {
CallExpression: function CallExpression(path) {
var node = path.node;
if (t.isIdentifier(node.callee, { name: 'minify' })) {
if (t.isTemplateLiteral(node.arguments[0])) {
transform(node.arguments[0].quasis);
return path.replaceWith(node.arguments[0]);
} else if (t.isTaggedTemplateExpression(node.arguments[0])) {
transform(node.arguments[0].quasi.quasis);
return path.replaceWith(node.arguments[0]);
}
}
},
TaggedTemplateExpression: function TaggedTemplateExpression(path) {
var node = path.node;
if (t.isIdentifier(node.tag, { name: 'minify' })) {
transform(node.quasi.quasis);
return path.replaceWith(node.quasi);
}
}
}
};
};
function transform(quasis) {
var elements = quasis.filter(function (element) {
return element.type === 'TemplateElement';
});
rtrim(elements[elements.length - 1]);
if (elements.length) {
// let size = Math.min(...matches.map(value => value.length - 1));
var pattern = new RegExp('\n[\t ]*', 'g');
['raw', 'cooked'].forEach(function (type) {
elements.forEach(function (element) {
element.value[type] = element.value[type].replace(pattern, '');
});
});
}
ltrim(elements[0]);
}
function ltrim(element) {
var pattern = /^\r?\n/;
if (pattern.test(element.value.raw)) {
element.value.raw = element.value.raw.replace(pattern, '');
element.value.cooked = element.value.cooked.replace(pattern, '');
}
return element;
}
function rtrim(element) {
var match = void 0;
if (match = element.value.raw.match(/\r?\n([\t ]*)$/)) {
var pattern = new RegExp('\r?\n[\t ]{' + match[1].length + '}$');
element.value.raw = element.value.raw.replace(pattern, '');
element.value.cooked = element.value.cooked.replace(pattern, '');
}
return element;
}