|
| 1 | +import pc from 'picocolors'; |
| 2 | +import { computePackageSizeInformation, getAllWorkspacePackages } from './package.js'; |
| 3 | +import { readSizeData, saveEsbuildMetafiles, saveSizeData } from './data.js'; |
| 4 | +import { computeSizeDiff } from './diff.js'; |
| 5 | + |
| 6 | +const TREE_SYM_HAS_NEXT = '├'; |
| 7 | +const TREE_SYM_FINAL = '└'; |
| 8 | + |
| 9 | +const FLAG_SAVE = process.argv.includes('--save'); |
| 10 | +const FLAG_SAVE_META = process.argv.includes('--save-meta'); |
| 11 | +const FLAG_COMPARE = process.argv.includes('--compare'); |
| 12 | +const FLAG_KEEP_BUILDS = process.argv.includes('--keep-builds'); |
| 13 | + |
| 14 | +function formatSize(size: number) { |
| 15 | + return `${(size / 1000).toFixed(2)}kB`.padEnd(7, ' '); |
| 16 | +} |
| 17 | + |
| 18 | +function formatDiffSize(size: number) { |
| 19 | + const str = Math.abs(size) < 1000 ? `${size}B` : `${(size / 1000).toFixed(3)}kB`; |
| 20 | + return size < 0 ? pc.green(str) : pc.red(`+${str}`); |
| 21 | +} |
| 22 | + |
| 23 | +// Get package info |
| 24 | +const packages = getAllWorkspacePackages(); |
| 25 | +const sizeData = packages.map((pkg) => computePackageSizeInformation(pkg, FLAG_KEEP_BUILDS)); |
| 26 | + |
| 27 | +// Compute diff if applicable |
| 28 | +const prevData = readSizeData(); |
| 29 | +const diff = prevData && computeSizeDiff(sizeData, prevData); |
| 30 | + |
| 31 | +// Save files |
| 32 | +if (FLAG_SAVE) saveSizeData(sizeData); |
| 33 | +if (FLAG_SAVE || FLAG_SAVE_META) saveEsbuildMetafiles(sizeData); |
| 34 | + |
| 35 | +// Print to stdout. |
| 36 | +for (const pkg of sizeData) { |
| 37 | + const pkgDiff = diff?.[pkg.name]; |
| 38 | + if (FLAG_COMPARE && pkgDiff?.diff === 0) continue; |
| 39 | + |
| 40 | + let pkgInfo = `${pkg.name.padEnd(34, ' ')}\t${formatSize(pkg.installSize).padEnd(8, ' ')} ${pc.gray('install size')}`; |
| 41 | + if (pkgDiff?.diff) pkgInfo += ` ${formatDiffSize(pkgDiff.diff)}`; |
| 42 | + |
| 43 | + console.log(pkgInfo); |
| 44 | + |
| 45 | + for (let i = 0; i < pkg.entries.length; i++) { |
| 46 | + const entry = pkg.entries[i]; |
| 47 | + const entryDiff = pkgDiff?.entries[entry.name]; |
| 48 | + |
| 49 | + const size = formatSize(entry.size); |
| 50 | + const gzip = `${formatSize(entry.gzip)} ${pc.gray('gzip')}`; |
| 51 | + const brotli = `${formatSize(entry.brotli)} ${pc.gray('brotli')}`; |
| 52 | + |
| 53 | + const treeSym = i === pkg.entries.length - 1 ? TREE_SYM_FINAL : TREE_SYM_HAS_NEXT; |
| 54 | + let entryInfo = `${treeSym}── ${entry.name.padEnd(30, ' ')}\t${treeSym}── ${size}\t${gzip}\t${brotli}`; |
| 55 | + if (entryDiff?.diff) { |
| 56 | + const size = formatDiffSize(entryDiff.diff); |
| 57 | + const gzip = formatDiffSize(entryDiff.gzip); |
| 58 | + const brotli = formatDiffSize(entryDiff.brotli); |
| 59 | + entryInfo += ` ${size}/${gzip}/${brotli}`; |
| 60 | + } |
| 61 | + |
| 62 | + console.log(entryInfo); |
| 63 | + } |
| 64 | + |
| 65 | + console.log(); |
| 66 | +} |
0 commit comments