Spaces:
Sleeping
Sleeping
module.exports = function formatStats (stats, dir, api) { | |
const fs = require('fs') | |
const path = require('path') | |
const zlib = require('zlib') | |
const ui = require('cliui')({ width: process.stdout.columns || 80 }) | |
const { chalk } = require('@vue/cli-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` | |
} | |