uui-build/ts/tasks/trackBundleSize/utils/baseLineComparator.ts (58 lines of code) (raw):

import { COMPARISON_THRESHOLD_PERCENTAGE } from '../constants'; import { TBundleSize, TBundleSizeBaseLine, TComparisonRes } from '../types'; /** * It expects all sizes specified in bytes, but the Markdown output will be generated in kBytes (for readability). */ export function compareBaseLines(params: { currentBaseLine: TBundleSizeBaseLine | undefined, newBaseLine: TBundleSizeBaseLine }): TComparisonRes { const { currentBaseLine, newBaseLine } = params; return Object.keys(newBaseLine.sizes).reduce<TComparisonRes>((acc, name) => { const size = newBaseLine.sizes[name]; const sizeTotal = size.js + size.css; /** * We use 0 as a baseline for any new packages without previous baseline */ const baseLineSize: TBundleSize = currentBaseLine?.sizes[name] || { css: 0, js: 0 }; const threshold = getThreshold(baseLineSize); const diff = getDiff(baseLineSize, size); const diffSeparated = getDiffSeparated(baseLineSize, size); const withinThreshold = sizeTotal >= threshold[0] && sizeTotal <= threshold[1]; const diffDetails = getDiffDetailsMd(diffSeparated); acc[name] = { baseLineSize: bytesToKbSeparated(baseLineSize), size: bytesToKbSeparated(size), diffLabel: `${getSign(diff)}${bytesToKb(diff)}<br />${diffDetails}`, withinThreshold, thresholdLabel: `${bytesToKb(threshold[0])} - ${bytesToKb(threshold[1])}`, }; return acc; }, {}); } function getDiffDetailsMd(params:{ js: number, css: number }) { const js = `${getSign(params.js)}${bytesToKb(params.js)}`; const css = `${getSign(params.css)}${bytesToKb(params.css)}`; const fence = '```'; return `${fence} js:${js}${fence}<br />${fence}css:${css} ${fence}`; } function getSign(diff: number) { return diff > 0 ? '+' : ''; } function normalizeSizeNumber(num: number) { return Number(Number(num).toFixed(2)); } function bytesToKbSeparated(bytes: TBundleSize) { return { js: bytesToKb(bytes.js), css: bytesToKb(bytes.css), }; } function bytesToKb(bytes: number) { return normalizeSizeNumber(bytes / 1024); } function getThreshold(size: TBundleSize) { const total = size.css + size.js; const pcNorm = COMPARISON_THRESHOLD_PERCENTAGE / 100; return [Math.floor(total * (1 - pcNorm)), Math.ceil(total * (1 + pcNorm))]; } function getDiff(prevSize: TBundleSize, nextSize: TBundleSize) { return (nextSize.js + nextSize.css) - (prevSize.js + prevSize.css); } function getDiffSeparated(prevSize: TBundleSize, nextSize: TBundleSize): TBundleSize { return { js: nextSize.js - prevSize.js, css: nextSize.css - prevSize.css, }; }