webpack-bundle-analyzer 3.5.2 → 3.8.0

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,39 @@ _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.8.0
18
+
19
+ * **Improvement**
20
+ * Added support for exports.modules when webpack target = node ([#345](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/345) by [@Spikef](https://github.com/Spikef))
21
+
22
+ * **New Feature**
23
+ * Support [WebWorkerChunkTemplatePlugin](https://github.com/webpack/webpack/blob/c9d4ff7b054fc581c96ce0e53432d44f9dd8ca72/lib/webworker/WebWorkerChunkTemplatePlugin.js) ([#353](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/353) by [@Gongreg](https://github.com/Gongreg))
24
+
25
+ * **Bug Fix**
26
+ * Support any custom `globalObject` option in Webpack Config. ([#352](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/352) by [@Gongreg](https://github.com/Gongreg))
27
+
28
+ ## 3.7.0
29
+
30
+ * **New Feature**
31
+ * Added JSON output option (`analyzerMode: "json"` in plugin, `--mode json` in CLI) ([#341](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/341) by [@Gongreg](https://github.com/Gongreg))
32
+
33
+ * **Improvement**
34
+ * Persist "Show content of concatenated modules" option ([#322](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/322) by [@lorenzos](https://github.com/lorenzos))
35
+
36
+ ## 3.6.1
37
+
38
+ * **Bug Fix**
39
+ * Add leading zero to hour & minute on `<title />` when needed ([#314](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/314) by [@mhxbe](https://github.com/mhxbe))
40
+
41
+ * **Internal**
42
+ * Update some dependencies to get rid of vulnerability warnings ([#339](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/339))
43
+
44
+ ## 3.6.0
45
+
46
+ * **Improvement**
47
+ * Support webpack builds where `output.globalObject` is set to `'self'` ([#323](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/323) by [@lemonmade](https://github.com/lemonmade))
48
+ * Improve readability of tooltips ([#320](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/320) by [@lorenzos](https://github.com/lorenzos))
49
+
17
50
  ## 3.5.2
18
51
 
19
52
  * **Bug Fix**
package/README.md CHANGED
@@ -56,7 +56,7 @@ new BundleAnalyzerPlugin(options?: object)
56
56
 
57
57
  |Name|Type|Description|
58
58
  |:--:|:--:|:----------|
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`. |
59
+ |**`analyzerMode`**|One of: `server`, `static`, `json`, `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 `json` mode single JSON 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
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).|
@@ -111,9 +111,10 @@ Directory containing all generated bundles.
111
111
 
112
112
  ```
113
113
  -V, --version output the version number
114
- -m, --mode <mode> Analyzer mode. Should be `server` or `static`.
114
+ -m, --mode <mode> Analyzer mode. Should be `server`, `static` or `json`.
115
115
  In `server` mode analyzer will start HTTP server to show bundle report.
116
- In `static` mode single HTML file with bundle report will be generated. (default: server)
116
+ In `static` mode single HTML file with bundle report will be generated.
117
+ In `json` mode single JSON file with bundle report will be generated. (default: server)
117
118
  -h, --host <host> Host that will be used in `server` mode to start HTTP server. (default: 127.0.0.1)
118
119
  -p, --port <n> Port that will be used in `server` mode to start HTTP server. Should be a number or `auto` (default: 8888)
119
120
  -r, --report <file> Path to bundle report file that will be generated in `static` mode. (default: report.html)
@@ -6,7 +6,7 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar
6
6
 
7
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
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; }
9
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
10
10
 
11
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; }
12
12
 
@@ -29,7 +29,7 @@ class BundleAnalyzerPlugin {
29
29
  this.opts = _objectSpread({
30
30
  analyzerMode: 'server',
31
31
  analyzerHost: '127.0.0.1',
32
- reportFilename: 'report.html',
32
+ reportFilename: null,
33
33
  defaultSizes: 'parsed',
34
34
  openAnalyzer: true,
35
35
  generateStatsFile: false,
@@ -67,13 +67,13 @@ class BundleAnalyzerPlugin {
67
67
  actions.push(() => this.startAnalyzerServer(stats.toJson()));
68
68
  } else if (this.opts.analyzerMode === 'static') {
69
69
  actions.push(() => this.generateStaticReport(stats.toJson()));
70
+ } else if (this.opts.analyzerMode === 'json') {
71
+ actions.push(() => this.generateJSONReport(stats.toJson()));
70
72
  }
71
73
 
72
74
  if (actions.length) {
73
75
  // Making analyzer logs to be after all webpack logs in the console
74
- setImmediate(
75
- /*#__PURE__*/
76
- _asyncToGenerator(function* () {
76
+ setImmediate( /*#__PURE__*/_asyncToGenerator(function* () {
77
77
  try {
78
78
  yield Promise.all(actions.map(action => action()));
79
79
  callback();
@@ -137,21 +137,34 @@ class BundleAnalyzerPlugin {
137
137
  })();
138
138
  }
139
139
 
140
- generateStaticReport(stats) {
140
+ generateJSONReport(stats) {
141
141
  var _this3 = this;
142
142
 
143
143
  return _asyncToGenerator(function* () {
144
- yield viewer.generateReport(stats, {
145
- openBrowser: _this3.opts.openAnalyzer,
146
- reportFilename: path.resolve(_this3.compiler.outputPath, _this3.opts.reportFilename),
144
+ yield viewer.generateJSONReport(stats, {
145
+ reportFilename: path.resolve(_this3.compiler.outputPath, _this3.opts.reportFilename || 'report.json'),
147
146
  bundleDir: _this3.getBundleDirFromCompiler(),
148
147
  logger: _this3.logger,
149
- defaultSizes: _this3.opts.defaultSizes,
150
148
  excludeAssets: _this3.opts.excludeAssets
151
149
  });
152
150
  })();
153
151
  }
154
152
 
153
+ generateStaticReport(stats) {
154
+ var _this4 = this;
155
+
156
+ return _asyncToGenerator(function* () {
157
+ yield viewer.generateReport(stats, {
158
+ openBrowser: _this4.opts.openAnalyzer,
159
+ reportFilename: path.resolve(_this4.compiler.outputPath, _this4.opts.reportFilename || 'report.html'),
160
+ bundleDir: _this4.getBundleDirFromCompiler(),
161
+ logger: _this4.logger,
162
+ defaultSizes: _this4.opts.defaultSizes,
163
+ excludeAssets: _this4.opts.excludeAssets
164
+ });
165
+ })();
166
+ }
167
+
155
168
  getBundleDirFromCompiler() {
156
169
  switch (this.compiler.outputFileSystem.constructor.name) {
157
170
  case 'MemoryFileSystem':
package/lib/analyzer.js CHANGED
@@ -20,7 +20,7 @@ const {
20
20
  createAssetsFilter
21
21
  } = require('./utils');
22
22
 
23
- const FILENAME_QUERY_REGEXP = /\?[\0-\t\x0B\f\x0E-\u2027\u202A-\u{10FFFF}]*$/u;
23
+ const FILENAME_QUERY_REGEXP = /\?.*$/u;
24
24
  const FILENAME_EXTENSIONS = /\.(js|mjs)$/iu;
25
25
  module.exports = {
26
26
  getViewerData,
@@ -28,9 +28,9 @@ const program = commander.version(require('../../package.json').version).usage(`
28
28
  bundleStatsFile Path to Webpack Stats JSON file.
29
29
  bundleDir Directory containing all generated bundles.
30
30
  You should provided it if you want analyzer to show you the real parsed module sizes.
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
31
+ By default a directory of stats file is used.`).option('-m, --mode <mode>', 'Analyzer mode. Should be `server`,`static` or `json`.' + 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.') + br('In `json` mode single JSON 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.', 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.').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,
@@ -44,7 +44,10 @@ let {
44
44
  } = program;
45
45
  const logger = new Logger(logLevel);
46
46
  if (!bundleStatsFile) showHelp('Provide path to Webpack Stats file as first argument');
47
- if (mode !== 'server' && mode !== 'static') showHelp('Invalid mode. Should be either `server` or `static`.');
47
+
48
+ if (mode !== 'server' && mode !== 'static' && mode !== 'json') {
49
+ showHelp('Invalid mode. Should be either `server`, `static` or `json`.');
50
+ }
48
51
 
49
52
  if (mode === 'server') {
50
53
  if (!host) showHelp('Invalid host name');
@@ -75,15 +78,22 @@ if (mode === 'server') {
75
78
  excludeAssets,
76
79
  logger: new Logger(logLevel)
77
80
  });
78
- } else {
81
+ } else if (mode === 'static') {
79
82
  viewer.generateReport(bundleStats, {
80
83
  openBrowser,
81
- reportFilename: resolve(reportFilename),
84
+ reportFilename: resolve(reportFilename || 'report.html'),
82
85
  defaultSizes,
83
86
  bundleDir,
84
87
  excludeAssets,
85
88
  logger: new Logger(logLevel)
86
89
  });
90
+ } else if (mode === 'json') {
91
+ viewer.generateJSONReport(bundleStats, {
92
+ reportFilename: resolve(reportFilename || 'report.json'),
93
+ bundleDir,
94
+ excludeAssets,
95
+ logger: new Logger(logLevel)
96
+ });
87
97
  }
88
98
 
89
99
  function showHelp(error) {
package/lib/parseUtils.js CHANGED
@@ -25,6 +25,20 @@ function parseBundle(bundlePath) {
25
25
  locations: null
26
26
  };
27
27
  walk.recursive(ast, walkState, {
28
+ AssignmentExpression(node, state) {
29
+ if (state.locations) return; // Modules are stored in exports.modules:
30
+ // exports.modules = {};
31
+
32
+ const {
33
+ left,
34
+ right
35
+ } = node;
36
+
37
+ if (left && left.object && left.object.name === 'exports' && left.property && left.property.name === 'modules' && isModulesHash(right)) {
38
+ state.locations = getModulesLocations(right);
39
+ }
40
+ },
41
+
28
42
  CallExpression(node, state, c) {
29
43
  if (state.locations) return;
30
44
  const args = node.arguments; // Main chunk with webpack loader.
@@ -50,6 +64,14 @@ function parseBundle(bundlePath) {
50
64
  if (isAsyncChunkPushExpression(node)) {
51
65
  state.locations = getModulesLocations(args[0].elements[1]);
52
66
  return;
67
+ } // Webpack v4 WebWorkerChunkTemplatePlugin
68
+ // globalObject.chunkCallbackName([<chunks>],<modules>, ...);
69
+ // Both globalObject and chunkCallbackName can be changed through the config, so we can't check them.
70
+
71
+
72
+ if (isAsyncWebWorkerChunkExpression(node)) {
73
+ state.locations = getModulesLocations(args[1]);
74
+ return;
53
75
  } // Walking into arguments because some of plugins (e.g. `DedupePlugin`) or some Webpack
54
76
  // features (e.g. `umd` library output) can wrap modules list into additional IIFE.
55
77
 
@@ -129,14 +151,22 @@ function isAsyncChunkPushExpression(node) {
129
151
  callee,
130
152
  arguments: args
131
153
  } = node;
132
- return callee.type === 'MemberExpression' && callee.property.name === 'push' && callee.object.type === 'AssignmentExpression' && callee.object.left.object && (callee.object.left.object.name === 'window' || // Webpack 4 uses `this` instead of `window`
133
- callee.object.left.object.type === 'ThisExpression') && args.length === 1 && args[0].type === 'ArrayExpression' && mayBeAsyncChunkArguments(args[0].elements) && isModulesList(args[0].elements[1]);
154
+ return callee.type === 'MemberExpression' && callee.property.name === 'push' && callee.object.type === 'AssignmentExpression' && args.length === 1 && args[0].type === 'ArrayExpression' && mayBeAsyncChunkArguments(args[0].elements) && isModulesList(args[0].elements[1]);
134
155
  }
135
156
 
136
157
  function mayBeAsyncChunkArguments(args) {
137
158
  return args.length >= 2 && isChunkIds(args[0]);
138
159
  }
139
160
 
161
+ function isAsyncWebWorkerChunkExpression(node) {
162
+ const {
163
+ callee,
164
+ type,
165
+ arguments: args
166
+ } = node;
167
+ return type === 'CallExpression' && callee.type === 'MemberExpression' && args.length === 2 && isChunkIds(args[0]) && isModulesList(args[1]);
168
+ }
169
+
140
170
  function getModulesLocations(node) {
141
171
  if (node.type === 'ObjectExpression') {
142
172
  // Modules hash
@@ -19,7 +19,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
19
19
 
20
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
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; }
22
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
23
23
 
24
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; }
25
25
 
@@ -11,7 +11,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
11
11
 
12
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
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; }
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
15
15
 
16
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; }
17
17
 
@@ -11,7 +11,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
11
11
 
12
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
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; }
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
15
15
 
16
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; }
17
17
 
@@ -21,7 +21,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
21
21
 
22
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
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; }
24
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
25
25
 
26
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; }
27
27
 
package/lib/utils.js CHANGED
@@ -45,7 +45,7 @@ exports.getCurrentTime = function () {
45
45
  const year = time.getFullYear();
46
46
  const month = MONTHS[time.getMonth()];
47
47
  const day = time.getDate();
48
- const hour = time.getHours();
49
- const minute = time.getMinutes();
48
+ const hour = `0${time.getHours()}`.slice(-2);
49
+ const minute = `0${time.getMinutes()}`.slice(-2);
50
50
  return `${day} ${month} ${year} at ${hour}:${minute}`;
51
51
  };
package/lib/viewer.js CHANGED
@@ -37,6 +37,7 @@ const assetsRoot = path.join(projectRoot, 'public');
37
37
  module.exports = {
38
38
  startServer,
39
39
  generateReport,
40
+ generateJSONReport,
40
41
  // deprecated
41
42
  start: startServer
42
43
  };
@@ -138,7 +139,7 @@ function _generateReport() {
138
139
  _generateReport = _asyncToGenerator(function* (bundleStats, opts) {
139
140
  const {
140
141
  openBrowser = true,
141
- reportFilename = 'report.html',
142
+ reportFilename,
142
143
  bundleDir = null,
143
144
  logger = new Logger(),
144
145
  defaultSizes = 'parsed',
@@ -186,6 +187,30 @@ function _generateReport() {
186
187
  return _generateReport.apply(this, arguments);
187
188
  }
188
189
 
190
+ function generateJSONReport(_x5, _x6) {
191
+ return _generateJSONReport.apply(this, arguments);
192
+ }
193
+
194
+ function _generateJSONReport() {
195
+ _generateJSONReport = _asyncToGenerator(function* (bundleStats, opts) {
196
+ const {
197
+ reportFilename,
198
+ bundleDir = null,
199
+ logger = new Logger(),
200
+ excludeAssets = null
201
+ } = opts || {};
202
+ const chartData = getChartData({
203
+ logger,
204
+ excludeAssets
205
+ }, bundleStats, bundleDir);
206
+ if (!chartData) return;
207
+ mkdir.sync(path.dirname(reportFilename));
208
+ fs.writeFileSync(reportFilename, JSON.stringify(chartData));
209
+ logger.info(`${bold('Webpack Bundle Analyzer')} saved JSON report to ${bold(reportFilename)}`);
210
+ });
211
+ return _generateJSONReport.apply(this, arguments);
212
+ }
213
+
189
214
  function getAssetContent(filename) {
190
215
  const assetPath = path.join(assetsRoot, filename);
191
216
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webpack-bundle-analyzer",
3
- "version": "3.5.2",
3
+ "version": "3.8.0",
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",
@@ -33,8 +33,8 @@
33
33
  "views"
34
34
  ],
35
35
  "dependencies": {
36
- "acorn": "^6.0.7",
37
- "acorn-walk": "^6.1.1",
36
+ "acorn": "^7.1.1",
37
+ "acorn-walk": "^7.1.1",
38
38
  "bfj": "^6.1.1",
39
39
  "chalk": "^2.4.1",
40
40
  "commander": "^2.18.0",
@@ -73,22 +73,22 @@
73
73
  "eslint-config-th0r-react": "2.0.0",
74
74
  "eslint-plugin-react": "7.12.4",
75
75
  "exports-loader": "0.7.0",
76
- "gulp": "4.0.0",
76
+ "gulp": "4.0.2",
77
77
  "gulp-babel": "8.0.0",
78
78
  "mobx": "5.9.4",
79
79
  "mobx-preact": "3.0.0",
80
- "mocha": "6.1.2",
80
+ "mocha": "6.2.2",
81
81
  "nightmare": "3.0.1",
82
82
  "postcss-icss-values": "2.0.2",
83
83
  "postcss-loader": "3.0.0",
84
84
  "preact": "8.4.2",
85
85
  "stream-combiner2": "1.1.1",
86
86
  "style-loader": "0.23.1",
87
- "terser-webpack-plugin": "1.2.3",
87
+ "terser-webpack-plugin": "1.4.3",
88
88
  "url-loader": "1.1.2",
89
- "webpack": "4.29.6",
90
- "webpack-cli": "3.3.0",
91
- "webpack-dev-server": "3.3.1"
89
+ "webpack": "4.42.0",
90
+ "webpack-cli": "3.3.11",
91
+ "webpack-dev-server": "3.10.3"
92
92
  },
93
93
  "keywords": [
94
94
  "webpack",