webpack-bundle-analyzer 3.3.2 → 3.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -14,6 +14,33 @@ _Note: Gaps between patch versions are faulty, broken or test releases._
14
14
 
15
15
  <!-- Add changelog entries for new changes under this section -->
16
16
 
17
+ ## 3.5.1
18
+
19
+ * **Bug Fix**
20
+ * Fix regression in support of webpack dev server and `webpack --watch` (issue [#312](https://github.com/webpack-contrib/webpack-bundle-analyzer/issues/312), fixed in [#313](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/313) by [@gaokun](https://github.com/gaokun))
21
+
22
+ ## 3.5.0
23
+
24
+ * **Improvements**
25
+ * Improved report title and added favicon ([#310](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/310), [@gaokun](https://github.com/gaokun))
26
+
27
+ ## 3.4.1
28
+
29
+ * **Bug Fix**
30
+ * Fix regression of requiring an object to be passed to `new BundleAnalyzerPlugin()` (issue [#300](https://github.com/webpack-contrib/webpack-bundle-analyzer/issues/300), fixed in [#302](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/302) by [@jerryOnlyZRJ](https://github.com/jerryOnlyZRJ))
31
+
32
+ ## 3.4.0
33
+
34
+ * **Improvements**
35
+ * Add `port: 'auto'` option ([#290](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/290), [@avin-kavish](https://github.com/avin-kavish))
36
+
37
+ * **Bug Fix**
38
+ * Avoid mutation of the generated `stats.json` ([#293](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/293), [@wood1986](https://github.com/wood1986))
39
+
40
+ * **Internal**
41
+ * Use Autoprefixer ([#266](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/266), [@bregenspan](https://github.com/bregenspan))
42
+ * Detect `AsyncMFS` to support dev-server of Nuxt 2.5 and above ([#275](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/275), [@amoshydra](https://github.com/amoshydra))
43
+
17
44
  ## 3.3.2
18
45
 
19
46
  * **Bug Fix**
package/README.md CHANGED
@@ -58,7 +58,7 @@ new BundleAnalyzerPlugin(options?: object)
58
58
  |:--:|:--:|:----------|
59
59
  |**`analyzerMode`**|One of: `server`, `static`, `disabled`|Default: `server`. In `server` mode analyzer will start HTTP server to show bundle report. In `static` mode single HTML file with bundle report will be generated. In `disabled` mode you can use this plugin to just generate Webpack Stats JSON file by setting `generateStatsFile` to `true`. |
60
60
  |**`analyzerHost`**|`{String}`|Default: `127.0.0.1`. Host that will be used in `server` mode to start HTTP server.|
61
- |**`analyzerPort`**|`{Number}`|Default: `8888`. Port that will be used in `server` mode to start HTTP server.|
61
+ |**`analyzerPort`**|`{Number}` or `auto`|Default: `8888`. Port that will be used in `server` mode to start HTTP server.|
62
62
  |**`reportFilename`**|`{String}`|Default: `report.html`. Path to bundle report file that will be generated in `static` mode. It can be either an absolute path or a path relative to a bundle output directory (which is output.path in webpack config).|
63
63
  |**`defaultSizes`**|One of: `stat`, `parsed`, `gzip`|Default: `parsed`. Module sizes to show in report by default. [Size definitions](#size-definitions) section describes what these values mean.|
64
64
  |**`openAnalyzer`**|`{Boolean}`|Default: `true`. Automatically open report in default browser.|
@@ -115,7 +115,7 @@ Directory containing all generated bundles.
115
115
  In `server` mode analyzer will start HTTP server to show bundle report.
116
116
  In `static` mode single HTML file with bundle report will be generated. (default: server)
117
117
  -h, --host <host> Host that will be used in `server` mode to start HTTP server. (default: 127.0.0.1)
118
- -p, --port <n> Port that will be used in `server` mode to start HTTP server. (default: 8888)
118
+ -p, --port <n> Port that will be used in `server` mode to start HTTP server. Should be a number or `auto` (default: 8888)
119
119
  -r, --report <file> Path to bundle report file that will be generated in `static` mode. (default: report.html)
120
120
  -s, --default-sizes <type> Module sizes to show in treemap by default.
121
121
  Possible values: stat, parsed, gzip (default: parsed)
@@ -4,7 +4,9 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try
4
4
 
5
5
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
6
6
 
7
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
7
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
8
+
9
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
8
10
 
9
11
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
10
12
 
@@ -23,11 +25,10 @@ const Logger = require('./Logger');
23
25
  const viewer = require('./viewer');
24
26
 
25
27
  class BundleAnalyzerPlugin {
26
- constructor(opts) {
28
+ constructor(opts = {}) {
27
29
  this.opts = _objectSpread({
28
30
  analyzerMode: 'server',
29
31
  analyzerHost: '127.0.0.1',
30
- analyzerPort: 8888,
31
32
  reportFilename: 'report.html',
32
33
  defaultSizes: 'parsed',
33
34
  openAnalyzer: true,
@@ -38,7 +39,9 @@ class BundleAnalyzerPlugin {
38
39
  logLevel: 'info',
39
40
  // deprecated
40
41
  startAnalyzer: true
41
- }, opts);
42
+ }, opts, {
43
+ analyzerPort: 'analyzerPort' in opts ? opts.analyzerPort === 'auto' ? 0 : opts.analyzerPort : 8888
44
+ });
42
45
  this.server = null;
43
46
  this.logger = new Logger(this.opts.logLevel);
44
47
  }
@@ -49,11 +52,10 @@ class BundleAnalyzerPlugin {
49
52
  const done = (stats, callback) => {
50
53
  callback = callback || (() => {});
51
54
 
52
- stats = stats.toJson(this.opts.statsOptions);
53
55
  const actions = [];
54
56
 
55
57
  if (this.opts.generateStatsFile) {
56
- actions.push(() => this.generateStatsFile(stats));
58
+ actions.push(() => this.generateStatsFile(stats.toJson(this.opts.statsOptions)));
57
59
  } // Handling deprecated `startAnalyzer` flag
58
60
 
59
61
 
@@ -62,9 +64,9 @@ class BundleAnalyzerPlugin {
62
64
  }
63
65
 
64
66
  if (this.opts.analyzerMode === 'server') {
65
- actions.push(() => this.startAnalyzerServer(stats));
67
+ actions.push(() => this.startAnalyzerServer(stats.toJson()));
66
68
  } else if (this.opts.analyzerMode === 'static') {
67
- actions.push(() => this.generateStaticReport(stats));
69
+ actions.push(() => this.generateStaticReport(stats.toJson()));
68
70
  }
69
71
 
70
72
  if (actions.length) {
@@ -151,7 +153,18 @@ class BundleAnalyzerPlugin {
151
153
  }
152
154
 
153
155
  getBundleDirFromCompiler() {
154
- return this.compiler.outputFileSystem.constructor.name === 'MemoryFileSystem' ? null : this.compiler.outputPath;
156
+ switch (this.compiler.outputFileSystem.constructor.name) {
157
+ case 'MemoryFileSystem':
158
+ return null;
159
+ // Detect AsyncMFS used by Nuxt 2.5 that replaces webpack's MFS during development
160
+ // Related: #274
161
+
162
+ case 'AsyncMFS':
163
+ return null;
164
+
165
+ default:
166
+ return this.compiler.outputPath;
167
+ }
155
168
  }
156
169
 
157
170
  }
@@ -30,7 +30,7 @@ const program = commander.version(require('../../package.json').version).usage(`
30
30
  You should provided it if you want analyzer to show you the real parsed module sizes.
31
31
  By default a directory of stats file is used.`).option('-m, --mode <mode>', 'Analyzer mode. Should be `server` or `static`.' + br('In `server` mode analyzer will start HTTP server to show bundle report.') + br('In `static` mode single HTML file with bundle report will be generated.'), 'server').option( // Had to make `host` parameter optional in order to let `-h` flag output help message
32
32
  // Fixes https://github.com/webpack-contrib/webpack-bundle-analyzer/issues/239
33
- '-h, --host [host]', 'Host that will be used in `server` mode to start HTTP server.', '127.0.0.1').option('-p, --port <n>', 'Port that will be used in `server` mode to start HTTP server.', Number, 8888).option('-r, --report <file>', 'Path to bundle report file that will be generated in `static` mode.', 'report.html').option('-s, --default-sizes <type>', 'Module sizes to show in treemap by default.' + br(`Possible values: ${[...SIZES].join(', ')}`), 'parsed').option('-O, --no-open', "Don't open report in default browser automatically.").option('-e, --exclude <regexp>', 'Assets that should be excluded from the report.' + br('Can be specified multiple times.'), array()).option('-l, --log-level <level>', 'Log level.' + br(`Possible values: ${[...Logger.levels].join(', ')}`), Logger.defaultLevel).parse(process.argv);
33
+ '-h, --host [host]', 'Host that will be used in `server` mode to start HTTP server.', '127.0.0.1').option('-p, --port <n>', 'Port that will be used in `server` mode to start HTTP server.', 8888).option('-r, --report <file>', 'Path to bundle report file that will be generated in `static` mode.', 'report.html').option('-s, --default-sizes <type>', 'Module sizes to show in treemap by default.' + br(`Possible values: ${[...SIZES].join(', ')}`), 'parsed').option('-O, --no-open', "Don't open report in default browser automatically.").option('-e, --exclude <regexp>', 'Assets that should be excluded from the report.' + br('Can be specified multiple times.'), array()).option('-l, --log-level <level>', 'Log level.' + br(`Possible values: ${[...Logger.levels].join(', ')}`), Logger.defaultLevel).parse(process.argv);
34
34
  let {
35
35
  mode,
36
36
  host,
@@ -45,8 +45,13 @@ let {
45
45
  const logger = new Logger(logLevel);
46
46
  if (!bundleStatsFile) showHelp('Provide path to Webpack Stats file as first argument');
47
47
  if (mode !== 'server' && mode !== 'static') showHelp('Invalid mode. Should be either `server` or `static`.');
48
- if (mode === 'server' && !host) showHelp('Invalid host name');
49
- if (mode === 'server' && isNaN(port)) showHelp('Invalid port number');
48
+
49
+ if (mode === 'server') {
50
+ if (!host) showHelp('Invalid host name');
51
+ port = port === 'auto' ? 0 : Number(port);
52
+ if (isNaN(port)) showHelp('Invalid port. Should be a number or `auto`');
53
+ }
54
+
50
55
  if (!SIZES.has(defaultSizes)) showHelp(`Invalid default sizes option. Possible values are: ${[...SIZES].join(', ')}`);
51
56
  bundleStatsFile = resolve(bundleStatsFile);
52
57
  if (!bundleDir) bundleDir = dirname(bundleStatsFile);
@@ -17,7 +17,9 @@ var _utils = require("./utils");
17
17
 
18
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
19
 
20
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
20
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
21
+
22
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
21
23
 
22
24
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
23
25
 
@@ -9,7 +9,9 @@ var _BaseFolder = _interopRequireDefault(require("./BaseFolder"));
9
9
 
10
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
11
 
12
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
13
+
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
13
15
 
14
16
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
17
 
@@ -9,7 +9,9 @@ var _Module = _interopRequireDefault(require("./Module"));
9
9
 
10
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
11
 
12
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
13
+
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
13
15
 
14
16
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
17
 
@@ -19,7 +19,9 @@ var _utils = require("./utils");
19
19
 
20
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
21
 
22
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
22
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
23
+
24
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
23
25
 
24
26
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
25
27
 
package/lib/utils.js CHANGED
@@ -6,6 +6,7 @@ const {
6
6
 
7
7
  const _ = require('lodash');
8
8
 
9
+ const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
9
10
  exports.createAssetsFilter = createAssetsFilter;
10
11
 
11
12
  function createAssetsFilter(excludePatterns) {
@@ -32,4 +33,19 @@ function createAssetsFilter(excludePatterns) {
32
33
  } else {
33
34
  return () => true;
34
35
  }
35
- }
36
+ }
37
+ /**
38
+ * @desc get string of current time
39
+ * format: dd/MMM HH:mm
40
+ * */
41
+
42
+
43
+ exports.getCurrentTime = function () {
44
+ const time = new Date();
45
+ const year = time.getFullYear();
46
+ const month = MONTHS[time.getMonth()];
47
+ const day = time.getDate();
48
+ const hour = time.getHours();
49
+ const minute = time.getMinutes();
50
+ return `${day} ${month} ${year} at ${hour}:${minute}`;
51
+ };
package/lib/viewer.js CHANGED
@@ -26,6 +26,8 @@ const {
26
26
  bold
27
27
  } = require('chalk');
28
28
 
29
+ const utils = require('./utils');
30
+
29
31
  const Logger = require('./Logger');
30
32
 
31
33
  const analyzer = require('./analyzer');
@@ -38,6 +40,7 @@ module.exports = {
38
40
  // deprecated
39
41
  start: startServer
40
42
  };
43
+ const title = `${process.env.npm_package_name || 'Webpack Bundle Analyzer'} [${utils.getCurrentTime()}]`;
41
44
 
42
45
  function startServer(_x, _x2) {
43
46
  return _startServer.apply(this, arguments);
@@ -70,6 +73,7 @@ function _startServer() {
70
73
  app.use('/', (req, res) => {
71
74
  res.render('viewer', {
72
75
  mode: 'server',
76
+ title,
73
77
 
74
78
  get chartData() {
75
79
  return chartData;
@@ -148,6 +152,7 @@ function _generateReport() {
148
152
  yield new Promise((resolve, reject) => {
149
153
  ejs.renderFile(`${projectRoot}/views/viewer.ejs`, {
150
154
  mode: 'static',
155
+ title,
151
156
  chartData,
152
157
  defaultSizes,
153
158
  enableWebSocket: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webpack-bundle-analyzer",
3
- "version": "3.3.2",
3
+ "version": "3.5.1",
4
4
  "description": "Webpack plugin and CLI utility that represents bundle content as convenient interactive zoomable treemap",
5
5
  "author": "Yury Grunin <grunin.ya@ya.ru>",
6
6
  "license": "MIT",
@@ -42,7 +42,7 @@
42
42
  "express": "^4.16.3",
43
43
  "filesize": "^3.6.1",
44
44
  "gzip-size": "^5.0.0",
45
- "lodash": "^4.17.10",
45
+ "lodash": "^4.17.15",
46
46
  "mkdirp": "^0.5.1",
47
47
  "opener": "^1.5.1",
48
48
  "ws": "^6.0.0"
@@ -57,6 +57,7 @@
57
57
  "@babel/preset-react": "7.0.0",
58
58
  "@babel/register": "7.4.0",
59
59
  "@babel/runtime": "7.4.3",
60
+ "autoprefixer": "9.5.1",
60
61
  "babel-eslint": "10.0.1",
61
62
  "babel-loader": "8.0.5",
62
63
  "babel-plugin-lodash": "3.3.4",