builder/lib/processors/uglifier.js

  1. const terser = require("terser");
  2. /**
  3. * Preserve comments which contain:
  4. * <ul>
  5. * <li>copyright notice</li>
  6. * <li>license terms</li>
  7. * <li>"@ui5-bundle"</li>
  8. * <li>"@ui5-bundle-raw-include"</li>
  9. * </ul>
  10. *
  11. * @type {RegExp}
  12. */
  13. const copyrightCommentsAndBundleCommentPattern = /copyright|\(c\)(?:[0-9]+|\s+[0-9A-za-z])|released under|license|\u00a9|^@ui5-bundle-raw-include |^@ui5-bundle /i;
  14. /**
  15. * Minifies the supplied resources.
  16. *
  17. * @public
  18. * @alias module:@ui5/builder.processors.uglifier
  19. * @param {object} parameters Parameters
  20. * @param {module:@ui5/fs.Resource[]} parameters.resources List of resources to be processed
  21. * @returns {Promise<module:@ui5/fs.Resource[]>} Promise resolving with uglified resources
  22. */
  23. module.exports = function({resources}) {
  24. return Promise.all(resources.map(async (resource) => {
  25. const code = await resource.getString();
  26. try {
  27. const result = await terser.minify({
  28. [resource.getPath()]: code
  29. }, {
  30. output: {
  31. comments: copyrightCommentsAndBundleCommentPattern,
  32. wrap_func_args: false
  33. },
  34. compress: false
  35. });
  36. resource.setString(result.code);
  37. return resource;
  38. } catch (err) {
  39. throw new Error(
  40. `Uglification failed with error: ${err.message} in file ${err.filename} ` +
  41. `(line ${err.line}, col ${err.col}, pos ${err.pos})`);
  42. }
  43. }));
  44. };