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.
78 lines
2.2 KiB
78 lines
2.2 KiB
1 month ago
|
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`)
|
||
|
)
|
||
|
|
||
|
const time = stats.endTime - stats.startTime
|
||
|
const now = new Date().toISOString()
|
||
|
const hash = stats.hash
|
||
|
const info = `Build at: ${chalk.white(now)} - Hash: ${chalk.white(hash)} - Time: ${chalk.white(time)}ms`
|
||
|
|
||
|
return `${ui.toString()}\n\n ${chalk.gray(`Images and other types of assets omitted.`)}\n ${info}\n`
|
||
|
}
|