BundleAnalyzerPlugin.js 3.45 KB
'use strict';

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var fs = require('fs');
var path = require('path');
var mkdir = require('mkdirp');

var _require = require('chalk'),
    bold = _require.bold;

var Logger = require('./Logger');
var viewer = require('./viewer');

var BundleAnalyzerPlugin = function () {
  function BundleAnalyzerPlugin(opts) {
    _classCallCheck(this, BundleAnalyzerPlugin);

    this.opts = _extends({
      analyzerMode: 'server',
      analyzerHost: '127.0.0.1',
      analyzerPort: 8888,
      reportFilename: 'report.html',
      openAnalyzer: true,
      generateStatsFile: false,
      statsFilename: 'stats.json',
      statsOptions: null,
      logLevel: 'info',
      // deprecated
      startAnalyzer: true
    }, opts);

    this.logger = new Logger(this.opts.logLevel);
  }

  BundleAnalyzerPlugin.prototype.apply = function apply(compiler) {
    var _this = this;

    this.compiler = compiler;

    compiler.plugin('done', function (stats) {
      stats = stats.toJson(_this.opts.statsOptions);

      var actions = [];

      if (_this.opts.generateStatsFile) {
        actions.push(function () {
          return _this.generateStatsFile(stats);
        });
      }

      // Handling deprecated `startAnalyzer` flag
      if (_this.opts.analyzerMode === 'server' && !_this.opts.startAnalyzer) {
        _this.opts.analyzerMode = 'disabled';
      }

      if (_this.opts.analyzerMode === 'server') {
        actions.push(function () {
          return _this.startAnalyzerServer(stats);
        });
      } else if (_this.opts.analyzerMode === 'static') {
        actions.push(function () {
          return _this.generateStaticReport(stats);
        });
      }

      if (actions.length) {
        // Making analyzer logs to be after all webpack logs in the console
        setImmediate(function () {
          actions.forEach(function (action) {
            return action();
          });
        });
      }
    });
  };

  BundleAnalyzerPlugin.prototype.generateStatsFile = function generateStatsFile(stats) {
    var statsFilepath = this.opts.statsFilename;

    if (!path.isAbsolute(statsFilepath)) {
      statsFilepath = path.resolve(this.compiler.outputPath, statsFilepath);
    }

    mkdir.sync(path.dirname(statsFilepath));

    fs.writeFileSync(statsFilepath, JSON.stringify(stats, null, 2));

    this.logger.info(bold('Webpack Bundle Analyzer') + ' saved stats file to ' + bold(statsFilepath));
  };

  BundleAnalyzerPlugin.prototype.startAnalyzerServer = function startAnalyzerServer(stats) {
    viewer.startServer(stats, {
      openBrowser: this.opts.openAnalyzer,
      host: this.opts.analyzerHost,
      port: this.opts.analyzerPort,
      bundleDir: this.compiler.outputPath,
      logger: this.logger
    });
  };

  BundleAnalyzerPlugin.prototype.generateStaticReport = function generateStaticReport(stats) {
    viewer.generateReport(stats, {
      openBrowser: this.opts.openAnalyzer,
      reportFilename: this.opts.reportFilename,
      bundleDir: this.compiler.outputPath,
      logger: this.logger
    });
  };

  return BundleAnalyzerPlugin;
}();

module.exports = BundleAnalyzerPlugin;