UNPKG

webpack-bundle-analyzer-sunburst

Version:

Webpack plugin and CLI utility that represents bundle content either as an interactive zoomable treemap or a sunburst chart

117 lines (92 loc) 3.57 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', analyzerPort: 8888, reportFilename: 'report.html', reportType: 'treemap', 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, port: this.opts.analyzerPort, bundleDir: this.compiler.outputPath, logger: this.logger, reportType: this.opts.reportType }); }; BundleAnalyzerPlugin.prototype.generateStaticReport = function generateStaticReport(stats) { viewer.generateReport(stats, { openBrowser: this.opts.openAnalyzer, reportFilename: this.opts.reportFilename, bundleDir: this.compiler.outputPath, logger: this.logger, reportType: this.opts.reportType }); }; return BundleAnalyzerPlugin; }(); module.exports = BundleAnalyzerPlugin;