From f5e5dcfede875aba5829f230da644ca01a91046d Mon Sep 17 00:00:00 2001 From: rameel Date: Thu, 8 Jan 2026 21:33:07 +0500 Subject: [PATCH 1/7] Add gzip/brotli compression to size comparison report --- .github/scripts/compare-packages-size.js | 88 ++++++++++++++++++------ 1 file changed, 68 insertions(+), 20 deletions(-) diff --git a/.github/scripts/compare-packages-size.js b/.github/scripts/compare-packages-size.js index b1e6a5c..4e8d905 100644 --- a/.github/scripts/compare-packages-size.js +++ b/.github/scripts/compare-packages-size.js @@ -1,7 +1,16 @@ import path from "node:path"; import { execSync as exec } from "node:child_process"; -import { statSync as stat, existsSync as exists, writeFileSync as write_file } from "node:fs"; import { globSync as glob } from "glob"; +import { + existsSync as exists, + readFileSync as read_file, + statSync as stat, + writeFileSync as write_file +} from "node:fs"; +import { + brotliCompressSync as brotli, + gzipSync as gzip +} from "node:zlib"; const MAIN_WORKTREE = ".worktrees/main"; @@ -9,14 +18,30 @@ function size(file) { return exists(file) ? stat(file).size : null; } -function format(bytes) { - if (bytes == null) { +function gzip_size(file) { + return exists(file) + ? gzip(read_file(file)).length + : null; +} + +function brotli_size(file) { + return exists(file) + ? brotli(read_file(file)).length + : null; +} + +function gather_file_sizes(file) { + return { no: size(file), gz: gzip_size(file), br: brotli_size(file) }; +} + +function format(length) { + if (length == null) { return "—"; } - return bytes >= 1024 - ? `${(bytes / 1024).toFixed(2)} KB` - : `${bytes} B`; + return length >= 1024 + ? `${(length / 1024).toFixed(2)} KiB` + : `${length} B`; } function delta(pr, main) { @@ -26,19 +51,35 @@ function delta(pr, main) { return pr - main; } -function icon(delta) { - if (delta == null) { +function format_delta(pr, main) { + if (pr == null || main == null) { + return "-"; + } + + let s = format(pr); + let d = pr - main; + + if (d !== 0) { + const sign = d > 0 ? "+" : ""; + s += ` (${sign}${format(d)})`; + } + + return s; +} + +function icon(d) { + if (d == null) { return "—"; } - if (delta > 0) return "🔴"; - if (delta < 0) return "🟢"; + if (d > 0) return "🔴"; + if (d < 0) return "🟢"; return ""; } function has_local_origin_main() { try { - exec('git show-ref --verify --quiet refs/remotes/origin/main', { stdio: ["pipe", "pipe", "pipe"] }); + exec('git show-ref --verify --quiet refs/remotes/origin/main', { stdio: "inherit" }); return true; } catch { @@ -50,14 +91,18 @@ function generate_report(files, pr, main) { let md = ` ### 📦 Bundle size comparison -| Name | main | PR | Δ | Delta | -|------|-----:|---:|---|-------:| +| Name | Size | Gzip | Brotli | Δ | +|------|-----:|-----:|-------:|---| `; for (const file of files) { - const d = delta(pr[file], main[file]); + const d = delta(pr[file].no, main[file].no); - md += `| ${path.basename(file)} | ${format(main[file])} | ${format(pr[file])} | ${icon(d)} | ${format(d)} |\n`; + const no_diff = format_delta(pr[file].no, main[file].no); + const gz_diff = format_delta(pr[file].gz, main[file].gz); + const br_diff = format_delta(pr[file].br, main[file].br); + + md += `| ${path.basename(file)} | ${no_diff} | ${gz_diff} | ${br_diff} | ${icon(d)} |\n`; } console.log(md); @@ -71,7 +116,7 @@ try { exec("npm run build", { stdio: "inherit" }); const pr_files = glob("dist/**/*.min.js"); - const pr_sizes = Object.fromEntries(pr_files.map(f => [f, size(f)])); + const pr_sizes = Object.fromEntries(pr_files.map(f => [f, gather_file_sizes(f)])); // // Main build @@ -81,11 +126,14 @@ try { exec("npm ci --include=dev", { cwd: MAIN_WORKTREE, stdio: "inherit" }); exec("npm run build", { cwd: MAIN_WORKTREE, stdio: "inherit" }); - const main_sizes = Object.fromEntries( - pr_files.map(f => [f, size(path.join(MAIN_WORKTREE, f))])); + const release_sizes = Object.fromEntries( + pr_files.map(f => [f, gather_file_sizes(path.join(MAIN_WORKTREE, f))])); - generate_report(pr_files, pr_sizes, main_sizes); + generate_report(pr_files, pr_sizes, release_sizes); +} +catch (e) { + console.log(e); } finally { - exec(`git worktree remove ${MAIN_WORKTREE}`, { stdio: "inherit" }); + exec(`git worktree remove -f ${MAIN_WORKTREE}`, { stdio: "inherit" }); } From 96004b04997c6e86798331ffb4c679416642319a Mon Sep 17 00:00:00 2001 From: rameel Date: Thu, 8 Jan 2026 21:33:51 +0500 Subject: [PATCH 2/7] Formatting --- .github/scripts/compare-packages-size.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/scripts/compare-packages-size.js b/.github/scripts/compare-packages-size.js index 4e8d905..758d732 100644 --- a/.github/scripts/compare-packages-size.js +++ b/.github/scripts/compare-packages-size.js @@ -31,7 +31,11 @@ function brotli_size(file) { } function gather_file_sizes(file) { - return { no: size(file), gz: gzip_size(file), br: brotli_size(file) }; + return { + no: size(file), + gz: gzip_size(file), + br: brotli_size(file) + }; } function format(length) { From 76473e6ffc1fed641331fc541e1eecfcc5ca6517 Mon Sep 17 00:00:00 2001 From: rameel Date: Thu, 8 Jan 2026 21:43:07 +0500 Subject: [PATCH 3/7] Move 'scripts' folder to project root --- package.json | 2 +- {.github/scripts => scripts}/compare-packages-size.js | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename {.github/scripts => scripts}/compare-packages-size.js (100%) diff --git a/package.json b/package.json index 3528b82..b6c7e6a 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "scripts": { "build": "cross-env NODE_ENV=production gulp build", "build:debug": "gulp build", - "size-report": "cross-env NODE_ENV=production SKIP_GIT_TAG_RESOLUTION=true node .github/scripts/compare-packages-size.js", + "size-report": "cross-env NODE_ENV=production SKIP_GIT_TAG_RESOLUTION=true node scripts/compare-packages-size.js", "test": "gulp build && vitest run && playwright test", "test:playwright": "playwright test", "test:vitest": "vitest run" diff --git a/.github/scripts/compare-packages-size.js b/scripts/compare-packages-size.js similarity index 100% rename from .github/scripts/compare-packages-size.js rename to scripts/compare-packages-size.js From e44821f86c1c8dac1a63af2a2dff504493a5aa17 Mon Sep 17 00:00:00 2001 From: rameel Date: Thu, 8 Jan 2026 21:48:02 +0500 Subject: [PATCH 4/7] Rename compare-packages-size.js to compare-package-sizes.js --- package.json | 2 +- scripts/{compare-packages-size.js => compare-package-sizes.js} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename scripts/{compare-packages-size.js => compare-package-sizes.js} (100%) diff --git a/package.json b/package.json index b6c7e6a..9f901d3 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "scripts": { "build": "cross-env NODE_ENV=production gulp build", "build:debug": "gulp build", - "size-report": "cross-env NODE_ENV=production SKIP_GIT_TAG_RESOLUTION=true node scripts/compare-packages-size.js", + "size-report": "cross-env NODE_ENV=production SKIP_GIT_TAG_RESOLUTION=true node scripts/compare-package-sizes.js", "test": "gulp build && vitest run && playwright test", "test:playwright": "playwright test", "test:vitest": "vitest run" diff --git a/scripts/compare-packages-size.js b/scripts/compare-package-sizes.js similarity index 100% rename from scripts/compare-packages-size.js rename to scripts/compare-package-sizes.js From cd93cf1b8731d73eb2608cbd4ca551b191a7d274 Mon Sep 17 00:00:00 2001 From: rameel Date: Thu, 8 Jan 2026 22:02:55 +0500 Subject: [PATCH 5/7] Run workflow on all file changes Remove path restrictions (.js, .ts, .json) from test workflow trigger to prevent PR merge blocks when only docs are updated --- .github/workflows/test.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f504d5a..336f491 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,10 +4,6 @@ on: pull_request: branches: [main] types: [opened, synchronize, reopened, ready_for_review] - paths: - - '**.js' - - '**.ts' - - '**.json' jobs: main: From 5414e7673792f2db3b26ca642608f7d1e5dcb4eb Mon Sep 17 00:00:00 2001 From: rameel Date: Thu, 8 Jan 2026 22:07:09 +0500 Subject: [PATCH 6/7] Check bundle size impact with terser passes=1 --- rollup.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rollup.config.js b/rollup.config.js index 3e28018..59879a7 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -55,7 +55,7 @@ function create_configuration({ plugin_name, input, format, optimize }) { comments: false }, compress: { - passes: 5, + passes: 1, ecma: 2020, drop_console: false, drop_debugger: true, From a38a4f38d90980fe6f7116973d0b55cf7d233375 Mon Sep 17 00:00:00 2001 From: rameel Date: Thu, 8 Jan 2026 22:13:23 +0500 Subject: [PATCH 7/7] Check bundle size impact --- rollup.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rollup.config.js b/rollup.config.js index 59879a7..68b6be5 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -55,7 +55,7 @@ function create_configuration({ plugin_name, input, format, optimize }) { comments: false }, compress: { - passes: 1, + passes: 5, ecma: 2020, drop_console: false, drop_debugger: true, @@ -63,7 +63,7 @@ function create_configuration({ plugin_name, input, format, optimize }) { arguments: true, unsafe_comps: true, unsafe_math: true, - unsafe_methods: true + unsafe_methods: false } })] },