index.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. var ProgressBar = require('progress');
  2. var chalk = require('chalk');
  3. var webpack = require('webpack');
  4. require('object.assign').shim();
  5. module.exports = function ProgressBarPlugin(options) {
  6. options = options || {};
  7. var stream = options.stream || process.stderr;
  8. var enabled = stream && stream.isTTY;
  9. if (!enabled) {
  10. return function () {};
  11. }
  12. var barLeft = chalk.bold('[');
  13. var barRight = chalk.bold(']');
  14. var preamble = chalk.cyan.bold(' build ') + barLeft;
  15. var barFormat = options.format || preamble + ':bar' + barRight + chalk.green.bold(' :percent');
  16. var summary = options.summary !== false;
  17. var summaryContent = options.summaryContent;
  18. var customSummary = options.customSummary;
  19. delete options.format;
  20. delete options.total;
  21. delete options.summary;
  22. delete options.summaryContent;
  23. delete options.customSummary;
  24. var barOptions = Object.assign({
  25. complete: '=',
  26. incomplete: ' ',
  27. width: 20,
  28. total: 100,
  29. clear: true
  30. }, options);
  31. var bar = new ProgressBar(barFormat, barOptions);
  32. var running = false;
  33. var startTime = 0;
  34. var lastPercent = 0;
  35. return new webpack.ProgressPlugin(function (percent, msg) {
  36. if (!running && lastPercent !== 0 && !customSummary) {
  37. stream.write('\n');
  38. }
  39. var newPercent = Math.ceil(percent * barOptions.width);
  40. if (lastPercent !== newPercent) {
  41. bar.update(percent, {
  42. msg: msg
  43. });
  44. lastPercent = newPercent;
  45. }
  46. if (!running) {
  47. running = true;
  48. startTime = new Date;
  49. lastPercent = 0;
  50. } else if (percent === 1) {
  51. var now = new Date;
  52. var buildTime = (now - startTime) / 1000 + 's';
  53. bar.terminate();
  54. if (summary) {
  55. stream.write(chalk.green.bold('Build completed in ' + buildTime + '\n\n'));
  56. } else if (summaryContent) {
  57. stream.write(summaryContent + '(' + buildTime + ')\n\n');
  58. }
  59. if (customSummary) {
  60. customSummary(buildTime);
  61. }
  62. running = false;
  63. }
  64. });
  65. };