webpack-bundle-analyzer 4.0.0-rc1 → 4.3.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/src/utils.js CHANGED
@@ -1,4 +1,4 @@
1
- const {inspect} = require('util');
1
+ const {inspect, types} = require('util');
2
2
  const _ = require('lodash');
3
3
  const opener = require('opener');
4
4
 
@@ -15,11 +15,11 @@ function createAssetsFilter(excludePatterns) {
15
15
  pattern = new RegExp(pattern, 'u');
16
16
  }
17
17
 
18
- if (_.isRegExp(pattern)) {
18
+ if (types.isRegExp(pattern)) {
19
19
  return (asset) => pattern.test(asset);
20
20
  }
21
21
 
22
- if (!_.isFunction(pattern)) {
22
+ if (typeof pattern !== 'function') {
23
23
  throw new TypeError(
24
24
  `Pattern should be either string, RegExp or a function, but "${inspect(pattern, {depth: 0})}" got.`
25
25
  );
@@ -30,7 +30,7 @@ function createAssetsFilter(excludePatterns) {
30
30
  .value();
31
31
 
32
32
  if (excludeFunctions.length) {
33
- return (asset) => _.every(excludeFunctions, fn => fn(asset) !== true);
33
+ return (asset) => excludeFunctions.every(fn => fn(asset) !== true);
34
34
  } else {
35
35
  return () => true;
36
36
  }
package/src/viewer.js CHANGED
@@ -3,18 +3,16 @@ const fs = require('fs');
3
3
  const http = require('http');
4
4
 
5
5
  const WebSocket = require('ws');
6
+ const sirv = require('sirv');
6
7
  const _ = require('lodash');
7
- const express = require('express');
8
- const ejs = require('ejs');
9
- const mkdir = require('mkdirp');
10
8
  const {bold} = require('chalk');
11
9
 
12
10
  const Logger = require('./Logger');
13
11
  const analyzer = require('./analyzer');
14
12
  const {open} = require('./utils');
13
+ const {renderViewer} = require('./template');
15
14
 
16
15
  const projectRoot = path.resolve(__dirname, '..');
17
- const assetsRoot = path.join(projectRoot, 'public');
18
16
 
19
17
  function resolveTitle(reportTitle) {
20
18
  if (typeof reportTitle === 'function') {
@@ -50,28 +48,26 @@ async function startServer(bundleStats, opts) {
50
48
 
51
49
  if (!chartData) return;
52
50
 
53
- const app = express();
54
-
55
- // Explicitly using our `ejs` dependency to render templates
56
- // Fixes #17
57
- app.engine('ejs', require('ejs').renderFile);
58
- app.set('view engine', 'ejs');
59
- app.set('views', `${projectRoot}/views`);
60
- app.use(express.static(`${projectRoot}/public`));
61
-
62
- app.use('/', (req, res) => {
63
- res.render('viewer', {
64
- mode: 'server',
65
- title: resolveTitle(reportTitle),
66
- get chartData() { return chartData },
67
- defaultSizes,
68
- enableWebSocket: true,
69
- // Helpers
70
- escapeJson
71
- });
51
+ const sirvMiddleware = sirv(`${projectRoot}/public`, {
52
+ // disables caching and traverse the file system on every request
53
+ dev: true
72
54
  });
73
55
 
74
- const server = http.createServer(app);
56
+ const server = http.createServer((req, res) => {
57
+ if (req.method === 'GET' && req.url === '/') {
58
+ const html = renderViewer({
59
+ mode: 'server',
60
+ title: resolveTitle(reportTitle),
61
+ chartData,
62
+ defaultSizes,
63
+ enableWebSocket: true
64
+ });
65
+ res.writeHead(200, {'Content-Type': 'text/html'});
66
+ res.end(html);
67
+ } else {
68
+ sirvMiddleware(req, res);
69
+ }
70
+ });
75
71
 
76
72
  await new Promise(resolve => {
77
73
  server.listen(port, host, () => {
@@ -140,44 +136,23 @@ async function generateReport(bundleStats, opts) {
140
136
 
141
137
  if (!chartData) return;
142
138
 
143
- await new Promise((resolve, reject) => {
144
- ejs.renderFile(
145
- `${projectRoot}/views/viewer.ejs`,
146
- {
147
- mode: 'static',
148
- title: resolveTitle(reportTitle),
149
- chartData,
150
- defaultSizes,
151
- enableWebSocket: false,
152
- // Helpers
153
- assetContent: getAssetContent,
154
- escapeJson
155
- },
156
- (err, reportHtml) => {
157
- try {
158
- if (err) {
159
- logger.error(err);
160
- reject(err);
161
- return;
162
- }
163
-
164
- const reportFilepath = path.resolve(bundleDir || process.cwd(), reportFilename);
165
-
166
- mkdir.sync(path.dirname(reportFilepath));
167
- fs.writeFileSync(reportFilepath, reportHtml);
168
-
169
- logger.info(`${bold('Webpack Bundle Analyzer')} saved report to ${bold(reportFilepath)}`);
170
-
171
- if (openBrowser) {
172
- open(`file://${reportFilepath}`, logger);
173
- }
174
- resolve();
175
- } catch (e) {
176
- reject(e);
177
- }
178
- }
179
- );
139
+ const reportHtml = renderViewer({
140
+ mode: 'static',
141
+ title: resolveTitle(reportTitle),
142
+ chartData,
143
+ defaultSizes,
144
+ enableWebSocket: false
180
145
  });
146
+ const reportFilepath = path.resolve(bundleDir || process.cwd(), reportFilename);
147
+
148
+ fs.mkdirSync(path.dirname(reportFilepath), {recursive: true});
149
+ fs.writeFileSync(reportFilepath, reportHtml);
150
+
151
+ logger.info(`${bold('Webpack Bundle Analyzer')} saved report to ${bold(reportFilepath)}`);
152
+
153
+ if (openBrowser) {
154
+ open(`file://${reportFilepath}`, logger);
155
+ }
181
156
  }
182
157
 
183
158
  async function generateJSONReport(bundleStats, opts) {
@@ -187,29 +162,12 @@ async function generateJSONReport(bundleStats, opts) {
187
162
 
188
163
  if (!chartData) return;
189
164
 
190
- mkdir.sync(path.dirname(reportFilename));
191
- fs.writeFileSync(reportFilename, JSON.stringify(chartData));
165
+ await fs.promises.mkdir(path.dirname(reportFilename), {recursive: true});
166
+ await fs.promises.writeFile(reportFilename, JSON.stringify(chartData));
192
167
 
193
168
  logger.info(`${bold('Webpack Bundle Analyzer')} saved JSON report to ${bold(reportFilename)}`);
194
169
  }
195
170
 
196
- function getAssetContent(filename) {
197
- const assetPath = path.join(assetsRoot, filename);
198
-
199
- if (!assetPath.startsWith(assetsRoot)) {
200
- throw new Error(`"${filename}" is outside of the assets root`);
201
- }
202
-
203
- return fs.readFileSync(assetPath, 'utf8');
204
- }
205
-
206
- /**
207
- * Escapes `<` characters in JSON to safely use it in `<script>` tag.
208
- */
209
- function escapeJson(json) {
210
- return JSON.stringify(json).replace(/</gu, '\\u003c');
211
- }
212
-
213
171
  function getChartData(analyzerOpts, ...args) {
214
172
  let chartData;
215
173
  const {logger} = analyzerOpts;
package/views/script.ejs DELETED
@@ -1,8 +0,0 @@
1
- <% if (mode === 'static') { %>
2
- <!-- <%= filename %> -->
3
- <script>
4
- <%- assetContent(filename) %>
5
- </script>
6
- <% } else { %>
7
- <script src="<%= filename %>"></script>
8
- <% } %>