minifyTemplate.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. var U2 = require("uglify-js");
  2. let htmlMinify = require('html-minifier').minify;
  3. var CleanCSS = require('clean-css');
  4. defaultOptions = {
  5. collapseWhitespace: true,
  6. minifyCSS:true,
  7. }
  8. module.exports = function (code, options){
  9. let mergedOptions = {...defaultOptions, ...options}
  10. const ast = U2.parse(code)
  11. let cssOptions = false;
  12. if (mergedOptions.minifyCSS){
  13. cssOptions = typeof mergedOptions.minifyCSS == 'object' ? mergedOptions.minifyCSS:{}
  14. }
  15. // Accumulate lit-html tempaltes nodes in this array
  16. const lit_html_templates = [];
  17. ast.walk(new U2.TreeWalker( (node)=>{
  18. if (node instanceof U2.AST_Template && node.tag && ['html','css','svg'].includes(node.tag.name)){
  19. lit_html_templates.push(node);
  20. }
  21. }))
  22. for (let i = lit_html_templates.length; --i >= 0 ;) {
  23. var node = lit_html_templates[i];
  24. const templateContent = node.strings.map(s=>s.replace(/[\n|\r]/gm, ' ')).join('${}')
  25. let output
  26. if(node.tag.name =="html"){
  27. output = htmlMinify(templateContent, mergedOptions);
  28. } else if(node.tag.name == "css" && cssOptions){
  29. output = new CleanCSS(cssOptions).minify(templateContent).styles;
  30. } else if(node.tag.name == "svg"){
  31. // Todo implement svgo optimisation
  32. output = htmlMinify(templateContent, mergedOptions);
  33. }
  34. node.strings = output.split("${}");
  35. }
  36. return ast.print_to_string({ beautify: false });;
  37. }