@micro-app/plugin-webpack
Version:
[Plugin] webpack adapter plugin.
75 lines (65 loc) • 2.25 kB
JavaScript
module.exports = function formatStats(stats, dir, api) {
const fs = require('fs');
const path = require('path');
const zlib = require('zlib');
const ui = require('cliui')({ width: 80 });
const { chalk } = require('@micro-app/shared-utils');
const json = stats.toJson({
hash: false,
modules: false,
chunks: false,
});
let assets = json.assets
? json.assets
: json.children.reduce((acc, child) => acc.concat(child.assets), []);
const seenNames = new Map();
const isJS = val => /\.js$/.test(val);
const isCSS = val => /\.css$/.test(val);
const isMinJS = val => /\.min\.js$/.test(val);
assets = assets
.map(a => {
a.name = a.name.split('?')[0];
return a;
})
.filter(a => {
if (seenNames.has(a.name)) {
return false;
}
seenNames.set(a.name, true);
return isJS(a.name) || isCSS(a.name);
})
.sort((a, b) => {
if (isJS(a.name) && isCSS(b.name)) return -1;
if (isCSS(a.name) && isJS(b.name)) return 1;
if (isMinJS(a.name) && !isMinJS(b.name)) return -1;
if (!isMinJS(a.name) && isMinJS(b.name)) return 1;
return b.size - a.size;
});
function formatSize(size) {
return (size / 1024).toFixed(2) + ' KiB';
}
function getGzippedSize(asset) {
const filepath = api.resolve(path.join(dir, asset.name));
const buffer = fs.readFileSync(filepath);
return formatSize(zlib.gzipSync(buffer).length);
}
function makeRow(a, b, c) {
return ` ${a}\t ${b}\t ${c}`;
}
ui.div(
makeRow(
chalk.cyan.bold('File'),
chalk.cyan.bold('Size'),
chalk.cyan.bold('Gzipped')
) + '\n\n' +
assets.map(asset => makeRow(
/js$/.test(asset.name)
? chalk.green(path.join(dir, asset.name))
: chalk.blue(path.join(dir, asset.name)),
formatSize(asset.size),
getGzippedSize(asset)
)).join('\n')
);
return `${ui.toString()}\n\n ${chalk.gray('Images and other types of assets omitted.')}\n`;
};
;