bundle-report
Version:
Track your bundle size over time
134 lines (119 loc) • 3.05 kB
JavaScript
const { error, warn, info } = require('prettycli')
const ciEnv = require('ci-env')
const build = require('./build')
const api = require('./api')
const { baseBranch } = require('./config')
const bytes = require('bytes')
const cliReporter = compared => {
if (!compared.length) {
error('no input files')
}
compared.map(file => {
switch (file.status) {
case STATUS.FAIL:
error(file.message, { label: 'FAIL', exit: false })
break
case STATUS.WARN:
warn(file.message)
break
default:
info(STATUS.PASS, file.message)
break
}
})
}
const apiReporter = compared => {
if (
!failed(compared) &&
ciEnv.event === 'push' &&
ciEnv.branch === baseBranch
) {
const values = compared.map(file => ({ path: file.name, size: file.size }))
api.set(values)
}
}
const statusReporter = compared => {
let message
if (compared.length === 1) {
message = compared[0].message
} else if (failed(compared)) {
message = 'bundle size > maxSize'
} else {
message = 'Good job! bundle size < maxSize'
}
/* prepare the build page */
const urlFiles = compared.map(f => {
const { name, maxSize, size } = f
const file = { maxSize, size, path: name }
if (f.master) {
file.master = f.master
}
return file
})
// debug('url before shortening', url)
if (failed(compared)) {
build.fail(message, urlFiles)
} else {
build.pass(message, urlFiles)
}
}
const compare = (files, masterValues = {}) => {
const results = files.map(file => {
const { path, size, maxSize, name } = file
const master = masterValues[name]
const value = `${path}: ${bytes(size)} gzip`
let message = ''
const result = {
maxSize,
path,
size,
name,
status: STATUS.PASS
}
if (size > maxSize) {
result.status = STATUS.FAIL
message = ` > max size ${bytes(maxSize)}`
} else if (size === maxSize) {
message = `, equals expected limit ${bytes(maxSize)}.`
} else if (!master) {
message = ` < max size ${bytes(maxSize)}`
} else if (size < master) {
message = `, ${bytes(
master - size
)} smaller than ${baseBranch}, good job!`
} else if (size > master) {
result.status = STATUS.WARN
message = `, ${bytes(size - master)} larger than ${baseBranch}, careful!`
} else {
message = `, unchanged from ${baseBranch}.`
}
result.message = `${value}${message}`
if (master) {
result.master = master
}
return result
})
return results
}
const STATUS = {
PASS: 'PASS',
FAIL: 'FAIL',
WARN: 'WARN'
}
const failed = compared => compared.some(v => v.status === STATUS.FAIL)
const reporter = (files, masterValues = {}) => {
const compared = compare(files, masterValues)
cliReporter(compared)
apiReporter(compared)
statusReporter(compared)
return compared
}
module.exports = {
default: compare,
reporter,
compare,
cliReporter,
statusReporter,
apiReporter,
STATUS
}