var U2 = require("uglify-js");
let htmlMinify = require('html-minifier').minify;
var CleanCSS = require('clean-css');
defaultOptions = {
collapseWhitespace: true,
minifyCSS:true,
}
module.exports = function (code, options){
let mergedOptions = {...defaultOptions, ...options}
const ast = U2.parse(code)
let cssOptions = false;
if (mergedOptions.minifyCSS){
cssOptions = typeof mergedOptions.minifyCSS == 'object' ? mergedOptions.minifyCSS:{}
}
// Accumulate lit-html tempaltes nodes in this array
const lit_html_templates = [];
ast.walk(new U2.TreeWalker( (node)=>{
if (node instanceof U2.AST_Template && node.tag && ['html','css','svg'].includes(node.tag.name)){
lit_html_templates.push(node);
}
}))
for (let i = lit_html_templates.length; --i >= 0 ;) {
var node = lit_html_templates[i];
const templateContent = node.strings.map(s=>s.replace(/[\n|\r]/gm, ' ')).join('${}')
let output
if(node.tag.name =="html"){
output = htmlMinify(templateContent, mergedOptions);
} else if(node.tag.name == "css" && cssOptions){
output = new CleanCSS(cssOptions).minify(templateContent).styles;
} else if(node.tag.name == "svg"){
// Todo implement svgo optimisation
output = htmlMinify(templateContent, mergedOptions);
}
node.strings = output.split("${}");
}
return ast.print_to_string({ beautify: false });;
}