You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
4.3 KiB
123 lines
4.3 KiB
#! /usr/bin/env node |
|
"use strict"; |
|
|
|
const { |
|
resolve, |
|
dirname |
|
} = require('path'); |
|
|
|
const commander = require('commander'); |
|
|
|
const { |
|
magenta |
|
} = require('chalk'); |
|
|
|
const analyzer = require('../analyzer'); |
|
|
|
const viewer = require('../viewer'); |
|
|
|
const Logger = require('../Logger'); |
|
|
|
const utils = require('../utils'); |
|
|
|
const SIZES = new Set(['stat', 'parsed', 'gzip']); |
|
const program = commander.version(require('../../package.json').version).usage(`<bundleStatsFile> [bundleDir] [options] |
|
|
|
Arguments: |
|
|
|
bundleStatsFile Path to Webpack Stats JSON file. |
|
bundleDir Directory containing all generated bundles. |
|
You should provided it if you want analyzer to show you the real parsed module sizes. |
|
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 |
|
// Fixes https://github.com/webpack-contrib/webpack-bundle-analyzer/issues/239 |
|
'-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('-t, --title <title>', 'String to use in title element of html report.').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); |
|
let [bundleStatsFile, bundleDir] = program.args; |
|
let { |
|
mode, |
|
host, |
|
port, |
|
report: reportFilename, |
|
title: reportTitle, |
|
defaultSizes, |
|
logLevel, |
|
open: openBrowser, |
|
exclude: excludeAssets |
|
} = program.opts(); |
|
const logger = new Logger(logLevel); |
|
|
|
if (typeof reportTitle === 'undefined') { |
|
reportTitle = utils.defaultTitle; |
|
} |
|
|
|
if (!bundleStatsFile) showHelp('Provide path to Webpack Stats file as first argument'); |
|
|
|
if (mode !== 'server' && mode !== 'static' && mode !== 'json') { |
|
showHelp('Invalid mode. Should be either `server`, `static` or `json`.'); |
|
} |
|
|
|
if (mode === 'server') { |
|
if (!host) showHelp('Invalid host name'); |
|
port = port === 'auto' ? 0 : Number(port); |
|
if (isNaN(port)) showHelp('Invalid port. Should be a number or `auto`'); |
|
} |
|
|
|
if (!SIZES.has(defaultSizes)) showHelp(`Invalid default sizes option. Possible values are: ${[...SIZES].join(', ')}`); |
|
bundleStatsFile = resolve(bundleStatsFile); |
|
if (!bundleDir) bundleDir = dirname(bundleStatsFile); |
|
let bundleStats; |
|
|
|
try { |
|
bundleStats = analyzer.readStatsFromFile(bundleStatsFile); |
|
} catch (err) { |
|
logger.error(`Couldn't read webpack bundle stats from "${bundleStatsFile}":\n${err}`); |
|
logger.debug(err.stack); |
|
process.exit(1); |
|
} |
|
|
|
if (mode === 'server') { |
|
viewer.startServer(bundleStats, { |
|
openBrowser, |
|
port, |
|
host, |
|
defaultSizes, |
|
reportTitle, |
|
bundleDir, |
|
excludeAssets, |
|
logger: new Logger(logLevel) |
|
}); |
|
} else if (mode === 'static') { |
|
viewer.generateReport(bundleStats, { |
|
openBrowser, |
|
reportFilename: resolve(reportFilename || 'report.html'), |
|
reportTitle, |
|
defaultSizes, |
|
bundleDir, |
|
excludeAssets, |
|
logger: new Logger(logLevel) |
|
}); |
|
} else if (mode === 'json') { |
|
viewer.generateJSONReport(bundleStats, { |
|
reportFilename: resolve(reportFilename || 'report.json'), |
|
bundleDir, |
|
excludeAssets, |
|
logger: new Logger(logLevel) |
|
}); |
|
} |
|
|
|
function showHelp(error) { |
|
if (error) console.log(`\n ${magenta(error)}\n`); |
|
program.outputHelp(); |
|
process.exit(1); |
|
} |
|
|
|
function br(str) { |
|
return `\n${' '.repeat(28)}${str}`; |
|
} |
|
|
|
function array() { |
|
const arr = []; |
|
return val => { |
|
arr.push(val); |
|
return arr; |
|
}; |
|
} |