Skip to content

feat: bundle-stats plugin poc implementation #1024

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 19 commits into
base: main
Choose a base branch
from

Conversation

BioPhoton
Copy link
Collaborator

@BioPhoton BioPhoton commented Jul 7, 2025

Bundle Stats Plugin PoC Implementation

Fine-grained bundle size tracking for your builds
This plugin enables advanced bundle stats capabilities to avoiding unwanted size increase.


📝 Related Issue

👉 #1015 – Bundle Stats Plugin Architecture Discussion

NOTE:
This PoC PR serves as an initial implementation to validate the proposed architecture and core functionality.
The final implementation will be delivered in smaller, focused PRs to ensure clarity, better reviewability, and incremental improvements.

Examples

Here you can have look at the JSON as well as Markdown report of the plugin.

{ } JSON Report

{
"commit": {
"hash": "c009534b5e154788947572c863d4a22c72f6be0b",
"message": "feat: MVP v1",
"date": "2025-07-13T22:54:22.000Z",
"author": "Michael"
},
"packageName": "@code-pushup/core",
"version": "0.69.2",
"date": "2025-07-14T01:32:27.553Z",
"duration": 101,
"plugins": [
{
"packageName": "@code-pushup/bundle-stats-plugin",
"version": "0.69.2",
"title": "Bundle Stats",
"slug": "bundle-stats",
"icon": "folder-rules",
"date": "2025-07-14T01:32:27.579Z",
"duration": 54,
"audits": [
{
"slug": "scoring-total-size-pass",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": []
},
"title": "📏 - Total Size Pass",
"description": "Demonstrates threshold passing when total size is within max limits.\n\n

\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\n
"
},
{
"slug": "scoring-total-size-pass-minmax",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": []
},
"title": "📏 - Total Size Pass Range",
"description": "Demonstrates threshold passing when total size is within range limits.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\n
"
},
{
"slug": "scoring-total-size-too-big",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 0,
"details": {
"issues": []
},
"title": "📏 - Total Size Too Big",
"description": "Demonstrates threshold failure when total size exceeds simple number limit.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 1 B\n\n
"
},
{
"slug": "scoring-total-size-too-small-minmax",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": []
},
"title": "📏 - Total Size Too Small Range",
"description": "Demonstrates threshold warning when total size is below minimum in range.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 1 B – 97.66 kB\n\n
"
},
{
"slug": "scoring-penalty-artefact-size-pass",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": []
},
"title": "📏 - Penalty Artefact Size Pass",
"description": "Demonstrates penalty passing when all files are within size limits.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n• penalty.artefactSize: 0 B – 97.66 kB\n\n
"
},
{
"slug": "scoring-penalty-artefact-size-pass-minmax",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": []
},
"title": "📏 - Penalty Artefact Size Pass Range",
"description": "Demonstrates penalty passing with min/max range constraints.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n• penalty.artefactSize: 0 B – 97.66 kB\n\n
"
},
{
"slug": "scoring-penalty-artefact-size-too-big",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 0,
"details": {
"issues": [
{
"message": "🔺 dist/index.js is 595 B (> 1 B)",
"severity": "error",
"source": {
"file": "dist/index.js"
}
},
{
"message": "🔺 dist/bin.js is 549 B (> 1 B)",
"severity": "error",
"source": {
"file": "dist/bin.js"
}
},
{
"message": "🔺 dist/chunks/chunk-PKX4VJZC.js is 50.14 kB (> 1 B)",
"severity": "error",
"source": {
"file": "dist/chunks/chunk-PKX4VJZC.js"
}
},
{
"message": "🔺 dist/chunks/feature-2-SERQNJVR.js is 130 B (> 1 B)",
"severity": "error",
"source": {
"file": "dist/chunks/feature-2-SERQNJVR.js"
}
},
{
"message": "🔺 dist/chunks/chunk-SK6HMZ5B.js is 1.33 kB (> 1 B)",
"severity": "error",
"source": {
"file": "dist/chunks/chunk-SK6HMZ5B.js"
}
}
]
},
"title": "📏 - Penalty Artefact Size Too Big",
"description": "Demonstrates penalty failure when files exceed maximum size.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n• penalty.artefactSize: 0 B – 1 B\n\n
"
},
{
"slug": "scoring-penalty-artefact-size-too-small-minmax",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": []
},
"title": "📏 - Penalty Artefact Size Too Small Range",
"description": "Demonstrates penalty warning when files are below minimum size.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n• penalty.artefactSize: 1 B – 97.66 kB\n\n
"
},
{
"slug": "scoring-penalty-blacklist-pass",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": []
},
"title": "📏 - Penalty Blacklist Pass",
"description": "Demonstrates penalty passing when no blacklisted patterns match.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n• penalty.blacklist: **/non-existent-pattern/**\n\n
"
},
{
"slug": "scoring-penalty-blacklist-fail",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 0,
"details": {
"issues": [
{
"message": "🚫 dist/index.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/index.js"
}
},
{
"message": "🚫 dist/chunks/chunk-PKX4VJZC.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/index.js"
}
},
{
"message": "🚫 dist/chunks/chunk-SK6HMZ5B.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/index.js"
}
},
{
"message": "🚫 dist/chunks/feature-2-SERQNJVR.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/index.js"
}
},
{
"message": "🚫 dist/bin.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/bin.js"
}
},
{
"message": "🚫 dist/chunks/chunk-PKX4VJZC.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/bin.js"
}
},
{
"message": "🚫 dist/chunks/chunk-SK6HMZ5B.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/bin.js"
}
},
{
"message": "🚫 dist/chunks/chunk-PKX4VJZC.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/chunks/chunk-PKX4VJZC.js"
}
},
{
"message": "🚫 dist/chunks/chunk-SK6HMZ5B.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/chunks/chunk-PKX4VJZC.js"
}
},
{
"message": "🚫 dist/chunks/feature-2-SERQNJVR.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/chunks/feature-2-SERQNJVR.js"
}
},
{
"message": "🚫 dist/chunks/chunk-SK6HMZ5B.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/chunks/feature-2-SERQNJVR.js"
}
},
{
"message": "🚫 dist/chunks/chunk-SK6HMZ5B.js matches blacklist pattern **/*",
"severity": "error",
"source": {
"file": "dist/chunks/chunk-SK6HMZ5B.js"
}
}
]
},
"title": "📏 - Penalty Blacklist Fail",
"description": "Demonstrates penalty failure when blacklisted patterns are found.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n• penalty.blacklist: **/*\n\n
"
},
{
"slug": "insights-grouping",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": [],
"table": {
"columns": [
{
"key": "group",
"label": "Group",
"align": "left"
},
{
"key": "size",
"label": "Size",
"align": "center"
}
],
"rows": [
{
"group": "📦 minimatch",
"size": "42.26 kB"
},
{
"group": "📦 brace-expansion",
"size": "4.67 kB"
},
{
"group": "🤝 chunks",
"size": "2.53 kB"
},
{
"group": "📦 balanced-match",
"size": "1.51 kB"
},
{
"group": "📦 Distributables",
"size": "595 B"
},
{
"group": "📦 bin",
"size": "549 B"
},
{
"group": "🔧 Formatting Utilities",
"size": "269 B"
},
{
"group": "🔧 Math Utilities",
"size": "145 B"
},
{
"group": "📦 my-lib",
"size": "93 B"
},
{
"group": "🧩 feature-2-SERQNJVR",
"size": "92 B"
},
{
"group": "🧩 feature-2",
"size": "38 B"
}
]
}
},
"title": "📊 - Insights Table - Grouping",
"description": "Demonstrates how the bundle is grouped.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\nInsights\n• 🔧 **/math.ts\n• 🔧 **/format.ts\n• 🧩 **/*feature-2*\n• 🏁 src/index.ts, src/bin.ts\n• 🤝 dist/chunks/chunk-*.js\n• 📦 **/node_modules/**\n• 📦 dist/index.js, dist/bin.js\n\n
"
},
{
"slug": "insights-rest-group",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": [],
"table": {
"columns": [
{
"key": "group",
"label": "Group",
"align": "left"
},
{
"key": "size",
"label": "Size",
"align": "center"
}
],
"rows": [
{
"group": "🧩 feature-1",
"size": "269 B"
},
{
"group": "Rest",
"size": "52.45 kB"
}
]
}
},
"title": "📊 - Insights Table - With Rest Group",
"description": "Demonstrates how all non-matching assets are grouped into the "Rest" row.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\nInsights\n• 🧩 **/*feature-1*\n\n
"
},
{
"slug": "tree-default",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": [],
"trees": [
{
"root": {
"name": "🗂️ tree-default",
"values": {
"size": "52.71 kB",
"sources": "21 sources"
},
"children": [
{
"name": "📍 dist/index.js",
"values": {
"size": "595 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/index.ts",
"values": {
"size": "386 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📍 dist/bin.js",
"values": {
"size": "549 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/bin.ts",
"values": {
"size": "373 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📄 dist/chunks/chunk-PKX4VJZC.js",
"values": {
"size": "50.14 kB",
"sources": "14 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/lib/utils/format.ts",
"values": {
"size": "269 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/feature-1.ts",
"values": {
"size": "269 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/utils/math.ts",
"values": {
"size": "145 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/utils/string.ts",
"values": {
"size": "54 B",
"sources": ""
},
"children": []
},
{
"name": "📁 @/",
"values": {
"size": "48.53 kB",
"sources": "9 sources"
},
"children": [
{
"name": "📄 ../../../../../node_modules/balanced-match/index.js",
"values": {
"size": "1.51 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/brace-expansion/index.js",
"values": {
"size": "4.67 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/index.js",
"values": {
"size": "23.4 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/assert-valid-pattern.js",
"values": {
"size": "261 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/brace-expressions.js",
"values": {
"size": "3.09 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/unescape.js",
"values": {
"size": "210 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/ast.js",
"values": {
"size": "15.15 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/escape.js",
"values": {
"size": "165 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/node_modules/my-lib/index.js",
"values": {
"size": "93 B",
"sources": ""
},
"children": []
}
]
}
]
},
{
"name": "📍 dist/chunks/feature-2-SERQNJVR.js",
"values": {
"size": "130 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/lib/feature-2.ts",
"values": {
"size": "38 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📄 dist/chunks/chunk-SK6HMZ5B.js",
"values": {
"size": "1.33 kB",
"sources": ""
},
"children": []
}
]
}
}
]
},
"title": "🌳 - Artefact Tree - Default",
"description": "Demonstrates default tree without any custom options.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\n
"
},
{
"slug": "tree-max-depth",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": [],
"trees": [
{
"root": {
"name": "🗂️ tree-max-depth",
"values": {
"size": "52.71 kB",
"sources": "21 sources"
},
"children": [
{
"name": "📍 dist/index.js",
"values": {
"size": "595 B",
"sources": "2 sources"
},
"children": []
},
{
"name": "📍 dist/bin.js",
"values": {
"size": "549 B",
"sources": "2 sources"
},
"children": []
},
{
"name": "📄 dist/chunks/chunk-PKX4VJZC.js",
"values": {
"size": "50.14 kB",
"sources": "14 sources"
},
"children": []
},
{
"name": "📍 dist/chunks/feature-2-SERQNJVR.js",
"values": {
"size": "130 B",
"sources": "2 sources"
},
"children": []
},
{
"name": "📄 dist/chunks/chunk-SK6HMZ5B.js",
"values": {
"size": "1.33 kB",
"sources": ""
},
"children": []
}
]
}
}
]
},
"title": "🌳 - Artefact Tree - Max Depth",
"description": "Demonstrates maxDepth pruning option.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\nArtefact Tree\n• pruning: maxDepth: 1\n\n
"
},
{
"slug": "tree-max-children",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": [],
"trees": [
{
"root": {
"name": "🗂️ tree-max-children",
"values": {
"size": "52.71 kB",
"sources": "21 sources"
},
"children": [
{
"name": "📍 dist/index.js",
"values": {
"size": "595 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/index.ts",
"values": {
"size": "386 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📍 dist/bin.js",
"values": {
"size": "549 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/bin.ts",
"values": {
"size": "373 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📁 ... 3 more",
"values": {
"size": "51.6 kB",
"sources": "17 sources"
},
"children": []
}
]
}
}
]
},
"title": "🌳 - Artefact Tree - Max Children",
"description": "Demonstrates maxChildren pruning option.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\nArtefact Tree\n• pruning: maxChildren: 2\n\n
"
},
{
"slug": "tree-start-depth",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": [],
"trees": [
{
"root": {
"name": "🗂️ tree-start-depth",
"values": {
"size": "52.71 kB",
"sources": "21 sources"
},
"children": [
{
"name": "📍 dist/index.js",
"values": {
"size": "595 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/index.ts",
"values": {
"size": "386 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📍 dist/bin.js",
"values": {
"size": "549 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/bin.ts",
"values": {
"size": "373 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📄 dist/chunks/chunk-PKX4VJZC.js",
"values": {
"size": "50.14 kB",
"sources": "14 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/lib/utils/format.ts",
"values": {
"size": "269 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/feature-1.ts",
"values": {
"size": "269 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/utils/math.ts",
"values": {
"size": "145 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/utils/string.ts",
"values": {
"size": "54 B",
"sources": ""
},
"children": []
},
{
"name": "📁 @/",
"values": {
"size": "48.53 kB",
"sources": "9 sources"
},
"children": [
{
"name": "📄 ../../../../../node_modules/balanced-match/index.js",
"values": {
"size": "1.51 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/brace-expansion/index.js",
"values": {
"size": "4.67 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/index.js",
"values": {
"size": "23.4 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/assert-valid-pattern.js",
"values": {
"size": "261 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/brace-expressions.js",
"values": {
"size": "3.09 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/unescape.js",
"values": {
"size": "210 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/ast.js",
"values": {
"size": "15.15 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/escape.js",
"values": {
"size": "165 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/node_modules/my-lib/index.js",
"values": {
"size": "93 B",
"sources": ""
},
"children": []
}
]
}
]
},
{
"name": "📍 dist/chunks/feature-2-SERQNJVR.js",
"values": {
"size": "130 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/lib/feature-2.ts",
"values": {
"size": "38 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📄 dist/chunks/chunk-SK6HMZ5B.js",
"values": {
"size": "1.33 kB",
"sources": ""
},
"children": []
}
]
}
}
]
},
"title": "🌳 - Artefact Tree - Start Depth",
"description": "Demonstrates startDepth pruning option.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\nArtefact Tree\n• pruning: startDepth: 2\n\n
"
},
{
"slug": "tree-groups-title-icon",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": [],
"trees": [
{
"root": {
"name": "🗂️ tree-groups-title-icon",
"values": {
"size": "52.71 kB",
"sources": "21 sources"
},
"children": [
{
"name": "📍 dist/index.js",
"values": {
"size": "595 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/index.ts",
"values": {
"size": "386 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📍 dist/bin.js",
"values": {
"size": "549 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/bin.ts",
"values": {
"size": "373 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📄 dist/chunks/chunk-PKX4VJZC.js",
"values": {
"size": "50.14 kB",
"sources": "14 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/lib/utils/format.ts",
"values": {
"size": "269 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/feature-1.ts",
"values": {
"size": "269 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/utils/math.ts",
"values": {
"size": "145 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/utils/string.ts",
"values": {
"size": "54 B",
"sources": ""
},
"children": []
},
{
"name": "📦 Node Modules",
"values": {
"size": "48.53 kB",
"sources": "9 sources"
},
"children": [
{
"name": "📄 ../../../../../node_modules/balanced-match/index.js",
"values": {
"size": "1.51 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/brace-expansion/index.js",
"values": {
"size": "4.67 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/index.js",
"values": {
"size": "23.4 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/assert-valid-pattern.js",
"values": {
"size": "261 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/brace-expressions.js",
"values": {
"size": "3.09 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/unescape.js",
"values": {
"size": "210 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/ast.js",
"values": {
"size": "15.15 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/escape.js",
"values": {
"size": "165 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/node_modules/my-lib/index.js",
"values": {
"size": "93 B",
"sources": ""
},
"children": []
}
]
}
]
},
{
"name": "📍 dist/chunks/feature-2-SERQNJVR.js",
"values": {
"size": "130 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/lib/feature-2.ts",
"values": {
"size": "38 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📄 dist/chunks/chunk-SK6HMZ5B.js",
"values": {
"size": "1.33 kB",
"sources": ""
},
"children": []
}
]
}
}
]
},
"title": "🌳 - Artefact Tree - Groups Title Icon",
"description": "Demonstrates groups with title and icon.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\nArtefact Tree\n• groups: 1\n\n
"
},
{
"slug": "tree-groups-pattern-only",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": [],
"trees": [
{
"root": {
"name": "🗂️ tree-groups-pattern-only",
"values": {
"size": "52.71 kB",
"sources": "21 sources"
},
"children": [
{
"name": "📍 dist/index.js",
"values": {
"size": "595 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/index.ts",
"values": {
"size": "386 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📍 dist/bin.js",
"values": {
"size": "549 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/bin.ts",
"values": {
"size": "373 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📄 dist/chunks/chunk-PKX4VJZC.js",
"values": {
"size": "50.14 kB",
"sources": "14 sources"
},
"children": [
{
"name": "📄 ../../../../../node_modules/balanced-match/index.js",
"values": {
"size": "1.51 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/brace-expansion/index.js",
"values": {
"size": "4.67 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/index.js",
"values": {
"size": "23.4 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/assert-valid-pattern.js",
"values": {
"size": "261 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/brace-expressions.js",
"values": {
"size": "3.09 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/unescape.js",
"values": {
"size": "210 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/ast.js",
"values": {
"size": "15.15 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/escape.js",
"values": {
"size": "165 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/node_modules/my-lib/index.js",
"values": {
"size": "93 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/feature-1.ts",
"values": {
"size": "269 B",
"sources": ""
},
"children": []
},
{
"name": "📁 ... 1 more",
"values": {
"size": "468 B",
"sources": "3 sources"
},
"children": []
}
]
},
{
"name": "📍 dist/chunks/feature-2-SERQNJVR.js",
"values": {
"size": "130 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/lib/feature-2.ts",
"values": {
"size": "38 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📄 dist/chunks/chunk-SK6HMZ5B.js",
"values": {
"size": "1.33 kB",
"sources": ""
},
"children": []
}
]
}
}
]
},
"title": "🌳 - Artefact Tree - Groups Pattern Only",
"description": "Demonstrates groups with pattern only.\n\n
\n⚙️ Config Summary\n\nSelection\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\nArtefact Tree\n• groups: 1\n\n
"
},
{
"slug": "tree-groups-max-depth",
"displayValue": "52.71 kB (5 files)",
"value": 53979,
"score": 1,
"details": {
"issues": [],
"trees": [
{
"root": {
"name": "🗂️ tree-groups-max-depth",
"values": {
"size": "52.71 kB",
"sources": "21 sources"
},
"children": [
{
"name": "📍 dist/index.js",
"values": {
"size": "595 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/index.ts",
"values": {
"size": "386 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📍 dist/bin.js",
"values": {
"size": "549 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/bin.ts",
"values": {
"size": "373 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📄 dist/chunks/chunk-PKX4VJZC.js",
"values": {
"size": "50.14 kB",
"sources": "14 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/lib/utils/format.ts",
"values": {
"size": "269 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/feature-1.ts",
"values": {
"size": "269 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/utils/math.ts",
"values": {
"size": "145 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/src/lib/utils/string.ts",
"values": {
"size": "54 B",
"sources": ""
},
"children": []
},
{
"name": "📁 ../esm/",
"values": {
"size": "48.53 kB",
"sources": "9 sources"
},
"children": [
{
"name": "📄 ../../../../../node_modules/balanced-match/index.js",
"values": {
"size": "1.51 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/brace-expansion/index.js",
"values": {
"size": "4.67 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/index.js",
"values": {
"size": "23.4 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/assert-valid-pattern.js",
"values": {
"size": "261 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/brace-expressions.js",
"values": {
"size": "3.09 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/unescape.js",
"values": {
"size": "210 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/ast.js",
"values": {
"size": "15.15 kB",
"sources": ""
},
"children": []
},
{
"name": "📄 ../../../../../node_modules/minimatch/dist/esm/escape.js",
"values": {
"size": "165 B",
"sources": ""
},
"children": []
},
{
"name": "📄 ../shared-source/node_modules/my-lib/index.js",
"values": {
"size": "93 B",
"sources": ""
},
"children": []
}
]
}
]
},
{
"name": "📍 dist/chunks/feature-2-SERQNJVR.js",
"values": {
"size": "130 B",
"sources": "2 sources"
},
"children": [
{
"name": "📄 ../shared-source/src/lib/feature-2.ts",
"values": {
"size": "38 B",
"sources": ""
},
"children": []
}
]
},
{
"name": "📄 dist/chunks/chunk-SK6HMZ5B.js",
"values": {
"size": "1.33 kB",
"sources": ""
},
"children": []
}
]
}
}
]
},
"title": "🌳 - Artefact Tree - Groups Max Depth",
"description": "Demonstrates per-group maxDepth option.\n\n
\n⚙️ Config Summary\n\nSelection**\n• includeOutputs: **/*\n\nScoring\n• totalSize: 0 B – 97.66 kB\n\nArtefact Tree\n• groups: 1\n\n
"
}
],
"description": "Official Code PushUp Bundle Stats plugin.",
"docsUrl": "https://npm.im/@code-pushup/bundle-stats-plugin",
"groups": []
}
]
}

📋 Markdown Report

Code PushUp Report

🛡️ Audits

📏 - Penalty Artefact Size Too Big (Bundle Stats)

🟥 52.71 kB (5 files) (score: 0)

Issues

Severity Message Source file Line(s)
🚨 error 🔺 dist/bin.js is 549 B (> 1 B) dist/bin.js
🚨 error 🔺 dist/chunks/chunk-PKX4VJZC.js is 50.14 kB (> 1 B) dist/chunks/chunk-PKX4VJZC.js
🚨 error 🔺 dist/chunks/chunk-SK6HMZ5B.js is 1.33 kB (> 1 B) dist/chunks/chunk-SK6HMZ5B.js
🚨 error 🔺 dist/chunks/feature-2-SERQNJVR.js is 130 B (> 1 B) dist/chunks/feature-2-SERQNJVR.js
🚨 error 🔺 dist/index.js is 595 B (> 1 B) dist/index.js

Demonstrates penalty failure when files exceed maximum size.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB
penalty.artefactSize: 0 B – 1 B

📏 - Penalty Blacklist Fail (Bundle Stats)

🟥 52.71 kB (5 files) (score: 0)

Issues

Severity Message Source file Line(s)
🚨 error 🚫 dist/bin.js matches blacklist pattern **/* dist/bin.js
🚨 error 🚫 dist/chunks/chunk-PKX4VJZC.js matches blacklist pattern **/* dist/bin.js
🚨 error 🚫 dist/chunks/chunk-SK6HMZ5B.js matches blacklist pattern **/* dist/bin.js
🚨 error 🚫 dist/chunks/chunk-PKX4VJZC.js matches blacklist pattern **/* dist/chunks/chunk-PKX4VJZC.js
🚨 error 🚫 dist/chunks/chunk-SK6HMZ5B.js matches blacklist pattern **/* dist/chunks/chunk-PKX4VJZC.js
🚨 error 🚫 dist/chunks/chunk-SK6HMZ5B.js matches blacklist pattern **/* dist/chunks/chunk-SK6HMZ5B.js
🚨 error 🚫 dist/chunks/feature-2-SERQNJVR.js matches blacklist pattern **/* dist/chunks/feature-2-SERQNJVR.js
🚨 error 🚫 dist/chunks/chunk-SK6HMZ5B.js matches blacklist pattern **/* dist/chunks/feature-2-SERQNJVR.js
🚨 error 🚫 dist/index.js matches blacklist pattern **/* dist/index.js
🚨 error 🚫 dist/chunks/chunk-PKX4VJZC.js matches blacklist pattern **/* dist/index.js
🚨 error 🚫 dist/chunks/chunk-SK6HMZ5B.js matches blacklist pattern **/* dist/index.js
🚨 error 🚫 dist/chunks/feature-2-SERQNJVR.js matches blacklist pattern **/* dist/index.js

Demonstrates penalty failure when blacklisted patterns are found.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB
penalty.blacklist: **/*

📏 - Total Size Too Big (Bundle Stats)

🟥 52.71 kB (5 files) (score: 0)

Demonstrates threshold failure when total size exceeds simple number limit.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 1 B

🌳 - Artefact Tree - Default (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)
🗂️ tree-default                                                                         52.71 kB  21 sources
├── 📍 dist/index.js                                                                        595 B   2 sources
│   └── 📄 ../shared-source/src/index.ts                                                    386 B            
├── 📍 dist/bin.js                                                                          549 B   2 sources
│   └── 📄 ../shared-source/src/bin.ts                                                      373 B            
├── 📄 dist/chunks/chunk-PKX4VJZC.js                                                     50.14 kB  14 sources
│   ├── 📄 ../shared-source/src/lib/utils/format.ts                                         269 B            
│   ├── 📄 ../shared-source/src/lib/feature-1.ts                                            269 B            
│   ├── 📄 ../shared-source/src/lib/utils/math.ts                                           145 B            
│   ├── 📄 ../shared-source/src/lib/utils/string.ts                                          54 B            
│   └── 📁 @*/*                                                                          48.53 kB   9 sources
│       ├── 📄 ../../../../../node_modules/balanced-match/index.js                        1.51 kB            
│       ├── 📄 ../../../../../node_modules/brace-expansion/index.js                       4.67 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/index.js                    23.4 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/assert-valid-pattern.js       261 B            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/brace-expressions.js        3.09 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/unescape.js                   210 B            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/ast.js                     15.15 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/escape.js                     165 B            
│       └── 📄 ../shared-source/node_modules/my-lib/index.js                                 93 B            
├── 📍 dist/chunks/feature-2-SERQNJVR.js                                                    130 B   2 sources
│   └── 📄 ../shared-source/src/lib/feature-2.ts                                             38 B            
└── 📄 dist/chunks/chunk-SK6HMZ5B.js                                                      1.33 kB            

Demonstrates default tree without any custom options.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

🌳 - Artefact Tree - Groups Max Depth (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)
🗂️ tree-groups-max-depth                                                                52.71 kB  21 sources
├── 📍 dist/index.js                                                                        595 B   2 sources
│   └── 📄 ../shared-source/src/index.ts                                                    386 B            
├── 📍 dist/bin.js                                                                          549 B   2 sources
│   └── 📄 ../shared-source/src/bin.ts                                                      373 B            
├── 📄 dist/chunks/chunk-PKX4VJZC.js                                                     50.14 kB  14 sources
│   ├── 📄 ../shared-source/src/lib/utils/format.ts                                         269 B            
│   ├── 📄 ../shared-source/src/lib/feature-1.ts                                            269 B            
│   ├── 📄 ../shared-source/src/lib/utils/math.ts                                           145 B            
│   ├── 📄 ../shared-source/src/lib/utils/string.ts                                          54 B            
│   └── 📁 ../esm/**                                                                     48.53 kB   9 sources
│       ├── 📄 ../../../../../node_modules/balanced-match/index.js                        1.51 kB            
│       ├── 📄 ../../../../../node_modules/brace-expansion/index.js                       4.67 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/index.js                    23.4 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/assert-valid-pattern.js       261 B            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/brace-expressions.js        3.09 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/unescape.js                   210 B            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/ast.js                     15.15 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/escape.js                     165 B            
│       └── 📄 ../shared-source/node_modules/my-lib/index.js                                 93 B            
├── 📍 dist/chunks/feature-2-SERQNJVR.js                                                    130 B   2 sources
│   └── 📄 ../shared-source/src/lib/feature-2.ts                                             38 B            
└── 📄 dist/chunks/chunk-SK6HMZ5B.js                                                      1.33 kB            

Demonstrates per-group maxDepth option.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

Artefact Tree
groups: 1

🌳 - Artefact Tree - Groups Pattern Only (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)
🗂️ tree-groups-pattern-only                                                         52.71 kB  21 sources
├── 📍 dist/index.js                                                                    595 B   2 sources
│   └── 📄 ../shared-source/src/index.ts                                                386 B            
├── 📍 dist/bin.js                                                                      549 B   2 sources
│   └── 📄 ../shared-source/src/bin.ts                                                  373 B            
├── 📄 dist/chunks/chunk-PKX4VJZC.js                                                 50.14 kB  14 sources
│   ├── 📄 ../../../../../node_modules/balanced-match/index.js                        1.51 kB            
│   ├── 📄 ../../../../../node_modules/brace-expansion/index.js                       4.67 kB            
│   ├── 📄 ../../../../../node_modules/minimatch/dist/esm/index.js                    23.4 kB            
│   ├── 📄 ../../../../../node_modules/minimatch/dist/esm/assert-valid-pattern.js       261 B            
│   ├── 📄 ../../../../../node_modules/minimatch/dist/esm/brace-expressions.js        3.09 kB            
│   ├── 📄 ../../../../../node_modules/minimatch/dist/esm/unescape.js                   210 B            
│   ├── 📄 ../../../../../node_modules/minimatch/dist/esm/ast.js                     15.15 kB            
│   ├── 📄 ../../../../../node_modules/minimatch/dist/esm/escape.js                     165 B            
│   ├── 📄 ../shared-source/node_modules/my-lib/index.js                                 93 B            
│   ├── 📄 ../shared-source/src/lib/feature-1.ts                                        269 B            
│   └── 📁 ... 1 more                                                                   468 B   3 sources
├── 📍 dist/chunks/feature-2-SERQNJVR.js                                                130 B   2 sources
│   └── 📄 ../shared-source/src/lib/feature-2.ts                                         38 B            
└── 📄 dist/chunks/chunk-SK6HMZ5B.js                                                  1.33 kB            

Demonstrates groups with pattern only.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

Artefact Tree
groups: 1

🌳 - Artefact Tree - Groups Title Icon (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)
🗂️ tree-groups-title-icon                                                               52.71 kB  21 sources
├── 📍 dist/index.js                                                                        595 B   2 sources
│   └── 📄 ../shared-source/src/index.ts                                                    386 B            
├── 📍 dist/bin.js                                                                          549 B   2 sources
│   └── 📄 ../shared-source/src/bin.ts                                                      373 B            
├── 📄 dist/chunks/chunk-PKX4VJZC.js                                                     50.14 kB  14 sources
│   ├── 📄 ../shared-source/src/lib/utils/format.ts                                         269 B            
│   ├── 📄 ../shared-source/src/lib/feature-1.ts                                            269 B            
│   ├── 📄 ../shared-source/src/lib/utils/math.ts                                           145 B            
│   ├── 📄 ../shared-source/src/lib/utils/string.ts                                          54 B            
│   └── 📦 Node Modules                                                                  48.53 kB   9 sources
│       ├── 📄 ../../../../../node_modules/balanced-match/index.js                        1.51 kB            
│       ├── 📄 ../../../../../node_modules/brace-expansion/index.js                       4.67 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/index.js                    23.4 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/assert-valid-pattern.js       261 B            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/brace-expressions.js        3.09 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/unescape.js                   210 B            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/ast.js                     15.15 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/escape.js                     165 B            
│       └── 📄 ../shared-source/node_modules/my-lib/index.js                                 93 B            
├── 📍 dist/chunks/feature-2-SERQNJVR.js                                                    130 B   2 sources
│   └── 📄 ../shared-source/src/lib/feature-2.ts                                             38 B            
└── 📄 dist/chunks/chunk-SK6HMZ5B.js                                                      1.33 kB            

Demonstrates groups with title and icon.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

Artefact Tree
groups: 1

🌳 - Artefact Tree - Max Children (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)
🗂️ tree-max-children                       52.71 kB  21 sources
├── 📍 dist/index.js                           595 B   2 sources
│   └── 📄 ../shared-source/src/index.ts       386 B            
├── 📍 dist/bin.js                             549 B   2 sources
│   └── 📄 ../shared-source/src/bin.ts         373 B            
└── 📁 ... 3 more                            51.6 kB  17 sources

Demonstrates maxChildren pruning option.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

Artefact Tree
pruning: maxChildren: 2

🌳 - Artefact Tree - Max Depth (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)
🗂️ tree-max-depth                          52.71 kB  21 sources
├── 📍 dist/index.js                           595 B   2 sources
├── 📍 dist/bin.js                             549 B   2 sources
├── 📄 dist/chunks/chunk-PKX4VJZC.js        50.14 kB  14 sources
├── 📍 dist/chunks/feature-2-SERQNJVR.js       130 B   2 sources
└── 📄 dist/chunks/chunk-SK6HMZ5B.js         1.33 kB            

Demonstrates maxDepth pruning option.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

Artefact Tree
pruning: maxDepth: 1

🌳 - Artefact Tree - Start Depth (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)
🗂️ tree-start-depth                                                                     52.71 kB  21 sources
├── 📍 dist/index.js                                                                        595 B   2 sources
│   └── 📄 ../shared-source/src/index.ts                                                    386 B            
├── 📍 dist/bin.js                                                                          549 B   2 sources
│   └── 📄 ../shared-source/src/bin.ts                                                      373 B            
├── 📄 dist/chunks/chunk-PKX4VJZC.js                                                     50.14 kB  14 sources
│   ├── 📄 ../shared-source/src/lib/utils/format.ts                                         269 B            
│   ├── 📄 ../shared-source/src/lib/feature-1.ts                                            269 B            
│   ├── 📄 ../shared-source/src/lib/utils/math.ts                                           145 B            
│   ├── 📄 ../shared-source/src/lib/utils/string.ts                                          54 B            
│   └── 📁 @*/*                                                                          48.53 kB   9 sources
│       ├── 📄 ../../../../../node_modules/balanced-match/index.js                        1.51 kB            
│       ├── 📄 ../../../../../node_modules/brace-expansion/index.js                       4.67 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/index.js                    23.4 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/assert-valid-pattern.js       261 B            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/brace-expressions.js        3.09 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/unescape.js                   210 B            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/ast.js                     15.15 kB            
│       ├── 📄 ../../../../../node_modules/minimatch/dist/esm/escape.js                     165 B            
│       └── 📄 ../shared-source/node_modules/my-lib/index.js                                 93 B            
├── 📍 dist/chunks/feature-2-SERQNJVR.js                                                    130 B   2 sources
│   └── 📄 ../shared-source/src/lib/feature-2.ts                                             38 B            
└── 📄 dist/chunks/chunk-SK6HMZ5B.js                                                      1.33 kB            

Demonstrates startDepth pruning option.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

Artefact Tree
pruning: startDepth: 2

📊 - Insights Table - Grouping (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)
Group Size
📦 minimatch 42.26 kB
📦 brace-expansion 4.67 kB
🤝 chunks 2.53 kB
📦 balanced-match 1.51 kB
📦 Distributables 595 B
📦 bin 549 B
🔧 Formatting Utilities 269 B
🔧 Math Utilities 145 B
📦 my-lib 93 B
🧩 feature-2-SERQNJVR 92 B
🧩 feature-2 38 B

Demonstrates how the bundle is grouped.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

Insights
• 🔧 **/math.ts
• 🔧 **/format.ts
• 🧩 **/*feature-2*
• 🏁 src/index.ts, src/bin.ts
• 🤝 dist/chunks/chunk-*.js
• 📦 **/node_modules/**
• 📦 dist/index.js, dist/bin.js

📊 - Insights Table - With Rest Group (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)
Group Size
🧩 feature-1 269 B
Rest 52.45 kB

Demonstrates how all non-matching assets are grouped into the "Rest" row.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

Insights
• 🧩 **/*feature-1*

📏 - Penalty Artefact Size Pass (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)

Demonstrates penalty passing when all files are within size limits.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB
penalty.artefactSize: 0 B – 97.66 kB

📏 - Penalty Artefact Size Pass Range (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)

Demonstrates penalty passing with min/max range constraints.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB
penalty.artefactSize: 0 B – 97.66 kB

📏 - Penalty Artefact Size Too Small Range (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)

Demonstrates penalty warning when files are below minimum size.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB
penalty.artefactSize: 1 B – 97.66 kB

📏 - Penalty Blacklist Pass (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)

Demonstrates penalty passing when no blacklisted patterns match.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB
penalty.blacklist: **/non-existent-pattern/**

📏 - Total Size Pass (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)

Demonstrates threshold passing when total size is within max limits.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

📏 - Total Size Pass Range (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)

Demonstrates threshold passing when total size is within range limits.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 0 B – 97.66 kB

📏 - Total Size Too Small Range (Bundle Stats)

🟩 52.71 kB (5 files) (score: 100)

Demonstrates threshold warning when total size is below minimum in range.

⚙️ Config Summary

Selection
includeOutputs: **/*

Scoring
totalSize: 1 B – 97.66 kB

About

Report was created by Code PushUp on Mon, Jul 14, 2025, 3:32 AM GMT+2.

Plugin Audits Version Duration
Bundle Stats 19 0.69.2 54 ms
Commit Version Duration Plugins Categories Audits
feat: MVP v1 (c009534) 0.69.2 101 ms 1 0 19

Made with ❤ by Code PushUp

Features

Legend:

  • Tested - 🧪
  • Documented/Planned - 📖
  • Implemented - 👩‍💻

Todos:

  • 📊 Stats Unification - 📖 👩‍💻 🧪
    • esbuild - 📖 👩‍💻 🧪
    • webpack - 📖
    • rsbuild - 📖
    • vite - 📖
    • roldown - 📖
  • 🎯 Selection - 📖 👩‍💻 🧪
    • output - 📖 👩‍💻 🧪
    • input - 📖 👩‍💻 🧪
    • entryPoint - 📖 👩‍💻 🧪
  • 📏 Scoring - 📖 👩‍💻 🧪
    • Total Size - 📖 👩‍💻 🧪
    • Penalty - 📖 👩‍💻 🧪
      • Too small - 📖 👩‍💻 🧪
      • Too big - 📖 👩‍💻 🧪
      • Blacklisted - 📖 👩‍💻 🧪
  • 🧠 Insights Table - 📖 👩‍💻
    • Good strategy for accurate "byte picking" - 📖 👩‍💻
    • Grouping - 📖 👩‍💻
    • Remaining Bytes - 📖 👩‍💻
  • 🌲 Artefact Tree - 📖 👩‍💻
    • Pruning - 📖 👩‍💻
    • Grouping - 📖 👩‍💻
    • Formatting - 📖 👩‍💻

✅ MVP State

The final implementation is delivered in the following PR's:

  • utils
  • runner
    • unify logic
    • selection
    • scoring
  • plugin
  • docs
  • e2e
  • runner optional
    • artefact tree
    • insights table

@github-actions github-actions bot added 📖 Project documentation improvements or additions to the project documentation 🔬 testing writing tests 🛠️ tooling labels Jul 7, 2025
Copy link

github-actions bot commented Jul 10, 2025

Code PushUp

🤨 Code PushUp report has both improvements and regressions – compared current commit 7eeb857 with previous commit 562c83b.

🕵️ See full comparison in Code PushUp portal 🔍

🏷️ Categories

🏷️ Category ⭐ Previous score ⭐ Current score 🔄 Score change
Code style 🟢 100 🟡 87 ↓ −13.4
Documentation 🔴 23 🔴 15 ↓ −8.2
Updates 🟡 77 🟡 74 ↓ −3.1
Performance 🔴 46 🔴 49 ↑ +2.8
Code coverage 🟢 90 🟡 88 ↓ −2.3
Bug prevention 🟢 100 🟢 98 ↓ −1.5
Security 🟡 61 🟡 61
Accessibility 🟢 92 🟢 92
Best Practices 🟢 100 🟢 100
SEO 🟡 61 🟡 61
Type Safety 🟢 100 🟢 100
Miscellaneous 🟢 100 🟢 100
👍 1 group improved, 👎 9 groups regressed, 👍 7 audits improved, 👎 54 audits regressed, 11 audits changed without impacting score

🗃️ Groups

🔌 Plugin 🗃️ Group ⭐ Previous score ⭐ Current score 🔄 Score change
ESLint No Mutations (functional) 🟢 100 🔴 0 ↓ −100
ESLint No Statements (functional) 🟢 100 🔴 0 ↓ −100
ESLint Helpful warnings (import) 🟢 100 🟡 75 ↓ −25
ESLint Style guide (import) 🟢 100 🟡 80 ↓ −20
ESLint Suggestions 🟢 100 🟡 87 ↓ −13.4
JSDoc coverage Documentation coverage 🔴 23 🔴 15 ↓ −8.2
ESLint Problems 🟢 100 🟢 94 ↓ −6
JS Packages NPM outdated dependencies 🟡 77 🟡 74 ↓ −3.1
Lighthouse Performance 🔴 46 🔴 49 ↑ +2.8
Code coverage Code coverage metrics 🟢 90 🟡 88 ↓ −2.3

11 other groups are unchanged.

🛡️ Audits

🔌 Plugin 🛡️ Audit 📏 Previous value 📏 Current value 🔄 Value change
ESLint Enforce treating data as immutable. 🟩 passed 🟥 93 errors ↑ +∞ %
ESLint Disallow imperative loops. 🟩 passed 🟥 48 warnings ↑ +∞ %
ESLint Enforce the style of numeric separators by correctly grouping digits. 🟩 passed 🟥 37 warnings ↑ +∞ %
ESLint Disallow unused variables 🟩 passed 🟥 23 errors ↑ +∞ %
ESLint Disallow mutable variables. 🟩 passed 🟥 20 warnings ↑ +∞ %
ESLint Disallow non-null assertions using the ! postfix operator 🟩 passed 🟥 20 errors ↑ +∞ %
ESLint Enforce type definitions to consistently use either interface or type 🟩 passed 🟥 17 warnings ↑ +∞ %
JSDoc coverage Interfaces coverage 🟩 0 undocumented interfaces 🟥 17 undocumented interfaces ↑ +∞ %
ESLint Disallow number literals with zero fractions or dangling dots. 🟩 passed 🟥 13 warnings ↑ +∞ %
ESLint Enforce consistent brace style for all control statements 🟩 passed 🟥 13 warnings ↑ +∞ %
ESLint enforce using toBe() 🟩 passed 🟥 12 warnings ↑ +∞ %
ESLint Enforce a maximum depth that blocks can be nested 🟩 passed 🟥 11 warnings ↑ +∞ %
ESLint Do not use a for loop that can be replaced with a for-of loop. 🟩 passed 🟥 9 warnings ↑ +∞ %
ESLint Disallow the any type 🟩 passed 🟥 8 errors ↑ +∞ %
ESLint Template literals should not be nested 🟩 passed 🟥 8 warnings ↑ +∞ %
ESLint Enforce a maximum number of lines of code in a function 🟩 passed 🟥 7 warnings ↑ +∞ %
ESLint Forbid any invalid exports, i.e. re-export of the same name. 🟩 passed 🟥 5 errors ↑ +∞ %
ESLint Disallow duplicate module imports 🟩 passed 🟥 5 warnings ↑ +∞ %
ESLint Require consistently using either T[] or Array<T> for arrays 🟩 passed 🟥 5 warnings ↑ +∞ %
ESLint enforce the style of file extensions in import declarations 🟩 passed 🟥 5 errors ↑ +∞ %
ESLint Checks dependencies in project's package.json for version mismatches 🟩 passed 🟥 5 errors ↑ +∞ %
ESLint Forbid repeated import of the same module in multiple places. 🟩 passed 🟥 4 warnings ↑ +∞ %
ESLint Collection and array contents should be used 🟩 passed 🟥 4 errors ↑ +∞ %
ESLint Disallow reassigning function parameters 🟩 passed 🟥 4 errors ↑ +∞ %
ESLint Enforce a maximum cyclomatic complexity allowed in a program 🟩 passed 🟥 3 warnings ↑ +∞ %
ESLint Disallow unnecessary escape characters 🟩 passed 🟥 2 errors ↑ +∞ %
ESLint Collapsible "if" statements should be merged 🟩 passed 🟥 2 warnings ↑ +∞ %
ESLint Disallow empty files. 🟩 passed 🟥 2 warnings ↑ +∞ %
ESLint Disallow if statements as the only statement in if blocks without else. 🟩 passed 🟥 2 warnings ↑ +∞ %
ESLint Disallow useless fallback when spreading in object literals. 🟩 passed 🟥 2 warnings ↑ +∞ %
ESLint Prefer .at() method for index access and String#charAt(). 🟩 passed 🟥 2 warnings ↑ +∞ %
ESLint Require for-in loops to include an if statement 🟩 passed 🟥 2 errors ↑ +∞ %
ESLint Require template literals instead of string concatenation 🟩 passed 🟥 2 warnings ↑ +∞ %
ESLint Disallow variable declarations from shadowing variables declared in the outer scope 🟩 passed 🟥 2 warnings ↑ +∞ %
ESLint Enforce consistent usage of type assertions 🟩 passed 🟥 2 errors ↑ +∞ %
ESLint Require const declarations for variables that are never reassigned after declared 🟩 passed 🟥 1 error ↑ +∞ %
ESLint String literals should not be duplicated 🟩 passed 🟥 1 warning ↑ +∞ %
ESLint Identical expressions should not be used on both sides of a binary operator 🟩 passed 🟥 1 error ↑ +∞ %
ESLint Disallow new Array(). 🟩 passed 🟥 1 warning ↑ +∞ %
ESLint Enforce throwing TypeError in type checking conditions. 🟩 passed 🟥 1 warning ↑ +∞ %
ESLint Require braces around arrow function bodies 🟩 passed 🟥 1 warning ↑ +∞ %
ESLint Enforce a maximum number of lines per file 🟩 passed 🟥 1 warning ↑ +∞ %
ESLint Enforce the use of top-level import type qualifier when an import only has specifiers with inline type qualifiers 🟩 passed 🟥 1 warning ↑ +∞ %
ESLint disallow unsupported Node.js built-in APIs on the specified version 🟩 passed 🟥 1 error ↑ +∞ %
ESLint Enforce padding around beforeEach blocks 🟩 passed 🟥 1 warning ↑ +∞ %
ESLint Enforce padding around test blocks 🟩 passed 🟥 1 warning ↑ +∞ %
ESLint Checks dependencies in project's package.json for version mismatches 🟩 passed 🟥 1 error ↑ +∞ %
Code coverage Line coverage 🟨 86.5 % 🟨 78 % ↓ −9.9 %
Lighthouse Speed Index 🟥 6.5 s 🟥 6.0 s ↓ −6.3 %
JSDoc coverage Functions coverage 🟥 476 undocumented functions 🟥 523 undocumented functions ↑ +9.9 %
Lighthouse First Contentful Paint 🟥 3.2 s 🟥 3.0 s ↓ −4.7 %
JS Packages Outdated NPM prod dependencies. 🟨 17 outdated package versions (5 major, 8 minor, 4 patch) 🟨 17 outdated package versions (6 major, 7 minor, 4 patch)  +0 %
Lighthouse Largest Contentful Paint 🟨 4.0 s 🟨 3.9 s ↓ −2.8 %
Lighthouse Total Blocking Time 🟥 3,840 ms 🟥 2,460 ms ↓ −36 %
Code coverage Function coverage 🟩 93.1 % 🟩 90.8 % ↓ −2.4 %
Lighthouse Time to Interactive 🟥 12.7 s 🟥 13.5 s ↑ +6.1 %
JSDoc coverage Variables coverage 🟥 218 undocumented variables 🟥 225 undocumented variables ↑ +3.2 %
JSDoc coverage Classes coverage 🟥 7 undocumented classes 🟥 8 undocumented classes ↑ +14.3 %
JSDoc coverage Types coverage 🟥 223 undocumented types 🟥 276 undocumented types ↑ +23.8 %
JS Packages Outdated NPM dev dependencies. 🟨 56 outdated package versions (29 major, 22 minor, 5 patch) 🟨 56 outdated package versions (29 major, 23 minor, 4 patch)  +0 %
Code coverage Branch coverage 🟨 85.7 % 🟨 85.4 % ↓ −0.3 %
Lighthouse Avoids enormous network payloads 🟩 Total size was 1,900 KiB 🟩 Total size was 2,027 KiB ↑ +6.7 %
Lighthouse Uses efficient cache policy on static assets 🟨 30 resources found 🟨 30 resources found ↑ +0.4 %
Lighthouse Minimizes main-thread work 🟥 16.4 s 🟥 13.8 s ↓ −15.7 %
Lighthouse Server Backend Latencies 🟩 160 ms 🟩 950 ms ↑ +493.5 %
Lighthouse Metrics 🟩 100% 🟩 100% ↑ +6.1 %
Lighthouse JavaScript execution time 🟥 6.5 s 🟥 5.8 s ↓ −10.4 %
Lighthouse Max Potential First Input Delay 🟥 2,140 ms 🟥 1,540 ms ↓ −27.7 %
Lighthouse Reduce unused CSS 🟥 Potential savings of 68 KiB 🟥 Potential savings of 69 KiB ↑ +188.2 %
Lighthouse Initial server response time was short 🟩 Root document took 450 ms 🟩 Root document took 540 ms ↑ +18.7 %
Lighthouse Network Round Trip Times 🟩 10 ms 🟩 30 ms ↑ +78.4 %
Lighthouse Avoids an excessive DOM size 🟥 2,248 elements 🟥 2,257 elements ↑ +0.4 %

533 other audits are unchanged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
📖 Project documentation improvements or additions to the project documentation 🔬 testing writing tests 🛠️ tooling 🧩 utils
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants