Skip to content

Commit b6136ab

Browse files
authored
Merge pull request #259 from z0ffy/feature/fix-calc
refactor: track bundle size and gzip size in raw bytes
2 parents 3262d0b + 5416887 commit b6136ab

File tree

2 files changed

+66
-14
lines changed

2 files changed

+66
-14
lines changed

src/__tests__/plugin.spec.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,43 @@ describe('CodeSizeAnalyzer', () => {
297297
expect(lastCallArgs[0]).toBe('\x1b[32m%s\x1b[0m');
298298
expect(lastCallArgs[1]).toContain('MB');
299299
});
300+
301+
it('should calculate percentage correctly when units differ', () => {
302+
const originalBundle: BundleList = [
303+
['test.js', { code: 'a'.repeat(500 * 1024) } as any]
304+
];
305+
306+
const obfuscatedBundle: BundleList = [
307+
['test.js', { code: 'a'.repeat(2 * 1024 * 1024) } as any]
308+
];
309+
310+
analyzer.start(originalBundle);
311+
analyzer.end(obfuscatedBundle);
312+
313+
const lastCallArgs = logSpy.mock.lastCall;
314+
expect(lastCallArgs[0]).toBe('\x1b[32m%s\x1b[0m');
315+
const result = lastCallArgs[1];
316+
317+
expect(result).toMatch(/\d+(\.\d+)?KB.*.*\d+(\.\d+)?MB/);
318+
expect(result).toMatch(/309\.\d+%/);
319+
});
320+
321+
it('should handle zero division when calculating percentage', () => {
322+
const emptyOriginalBundle: BundleList = [];
323+
324+
const obfuscatedBundle: BundleList = [
325+
['test.js', { code: 'console.log("test");' } as any]
326+
];
327+
328+
analyzer.start(emptyOriginalBundle);
329+
analyzer.end(obfuscatedBundle);
330+
331+
const lastCallArgs = logSpy.mock.lastCall;
332+
expect(lastCallArgs[0]).toBe('\x1b[32m%s\x1b[0m');
333+
const result = lastCallArgs[1];
334+
335+
expect(result).toContain('0.00%');
336+
});
300337
});
301338

302339
describe('is utils', () => {

src/utils/index.ts

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -264,13 +264,17 @@ export class CodeSizeAnalyzer {
264264
private _log;
265265
private originalSize: SizeResult;
266266
private obfuscatedSize: SizeResult;
267+
private originalBytes: { total: number; gzip: number };
268+
private obfuscatedBytes: { total: number; gzip: number };
267269
private startTime: number;
268270
private endTime: number;
269271

270272
constructor(log: Log) {
271273
this._log = log;
272274
this.originalSize = this.createEmptySizeResult();
273275
this.obfuscatedSize = this.createEmptySizeResult();
276+
this.originalBytes = { total: 0, gzip: 0 };
277+
this.obfuscatedBytes = { total: 0, gzip: 0 };
274278
this.startTime = 0;
275279
this.endTime = 0;
276280
}
@@ -284,16 +288,23 @@ export class CodeSizeAnalyzer {
284288

285289
start(originalBundleList: BundleList): void {
286290
this.startTime = performance.now();
287-
this.originalSize = this.calculateBundleSize(originalBundleList);
291+
const { size, bytes } = this.calculateBundleSize(originalBundleList);
292+
this.originalSize = size;
293+
this.originalBytes = bytes;
288294
}
289295

290296
end(obfuscatedBundleList: BundleList): void {
291-
this.obfuscatedSize = this.calculateBundleSize(obfuscatedBundleList);
297+
const { size, bytes } = this.calculateBundleSize(obfuscatedBundleList);
298+
this.obfuscatedSize = size;
299+
this.obfuscatedBytes = bytes;
292300
this.endTime = performance.now();
293301
this.logResult();
294302
}
295303

296-
private calculateBundleSize(bundleList: BundleList): { original: FormatSizeResult; gzip: FormatSizeResult } {
304+
private calculateBundleSize(bundleList: BundleList): {
305+
size: { original: FormatSizeResult; gzip: FormatSizeResult };
306+
bytes: { total: number; gzip: number };
307+
} {
297308
const { totalSize, gzipSize } = bundleList.reduce(
298309
(acc, [, bundleItem]) => {
299310
if (bundleItem.code) {
@@ -307,25 +318,29 @@ export class CodeSizeAnalyzer {
307318
);
308319

309320
return {
310-
original: formatSize(totalSize),
311-
gzip: formatSize(gzipSize),
321+
size: {
322+
original: formatSize(totalSize),
323+
gzip: formatSize(gzipSize),
324+
},
325+
bytes: {
326+
total: totalSize,
327+
gzip: gzipSize,
328+
},
312329
};
313330
}
314331

315332
private analyze(): string {
316-
const { originalSize, obfuscatedSize } = this;
333+
const { originalSize, obfuscatedSize, originalBytes, obfuscatedBytes } = this;
317334

318335
const consume = formatTime(this.endTime - this.startTime);
319336

320-
const percentageIncrease = (
321-
((obfuscatedSize.original.value - originalSize.original.value) / originalSize.original.value)
322-
* 100
323-
).toFixed(2);
337+
const percentageIncrease = originalBytes.total > 0
338+
? (((obfuscatedBytes.total - originalBytes.total) / originalBytes.total) * 100).toFixed(2)
339+
: '0.00';
324340

325-
const gzipPercentageIncrease = (
326-
((obfuscatedSize.gzip.value - originalSize.gzip.value) / originalSize.gzip.value)
327-
* 100
328-
).toFixed(2);
341+
const gzipPercentageIncrease = originalBytes.gzip > 0
342+
? (((obfuscatedBytes.gzip - originalBytes.gzip) / originalBytes.gzip) * 100).toFixed(2)
343+
: '0.00';
329344

330345
return `✓ obfuscated in ${consume} | 📦 ${originalSize.original.value}${originalSize.original.unit} (gzip: ${originalSize.gzip.value}${originalSize.gzip.unit}) → 🔒 ${obfuscatedSize.original.value}${obfuscatedSize.original.unit} (gzip: ${obfuscatedSize.gzip.value}${obfuscatedSize.gzip.unit}) | 📈 ${percentageIncrease}% (gzip: ${gzipPercentageIncrease}%)`;
331346
}

0 commit comments

Comments
 (0)