@node-cli/bundlecheck 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/trend.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { Logger } from "@node-cli/logger";
2
2
  import kleur from "kleur";
3
3
  import { prerelease } from "semver";
4
- import { checkBundleSize, formatBytes } from "./bundler.js";
4
+ import { checkBundleSize, formatBytes, getExternals, parsePackageSpecifier } from "./bundler.js";
5
+ import { getCachedResult, normalizeCacheKey, setCachedResult } from "./cache.js";
5
6
  import { TREND_VERSION_COUNT } from "./defaults.js";
6
7
  /**
7
8
  * Select versions for trend analysis
@@ -15,13 +16,41 @@ import { TREND_VERSION_COUNT } from "./defaults.js";
15
16
  /**
16
17
  * Analyze bundle size trend across multiple versions
17
18
  */ export async function analyzeTrend(options) {
18
- const { packageName, versions, exports, additionalExternals, noExternal, gzipLevel, boring, registry } = options;
19
+ const { packageName, versions, exports, additionalExternals, noExternal, gzipLevel, boring, registry, platform, force } = options;
19
20
  const log = new Logger({
20
21
  boring
21
22
  });
22
23
  const results = [];
24
+ // Parse base package name (without version)
25
+ const { name: baseName } = parsePackageSpecifier(packageName);
26
+ // Compute externals for cache key (same logic as bundler)
27
+ const externals = getExternals(baseName, additionalExternals, noExternal);
23
28
  for (const version of versions){
24
29
  const versionedPackage = `${packageName}@${version}`;
30
+ // Build cache key for this version
31
+ // Note: platform can be undefined (auto-detect), which is stored as "auto" in cache
32
+ const cacheKey = normalizeCacheKey({
33
+ packageName: baseName,
34
+ version,
35
+ exports,
36
+ platform,
37
+ gzipLevel: gzipLevel ?? 5,
38
+ externals,
39
+ noExternal: noExternal ?? false
40
+ });
41
+ // Check cache first (unless --force flag is set)
42
+ if (!force) {
43
+ const cached = getCachedResult(cacheKey);
44
+ if (cached) {
45
+ log.info(` Checking ${version}... (cached)`);
46
+ results.push({
47
+ version,
48
+ rawSize: cached.rawSize,
49
+ gzipSize: cached.gzipSize
50
+ });
51
+ continue;
52
+ }
53
+ }
25
54
  log.info(` Checking ${version}...`);
26
55
  try {
27
56
  const result = await checkBundleSize({
@@ -30,8 +59,11 @@ import { TREND_VERSION_COUNT } from "./defaults.js";
30
59
  additionalExternals,
31
60
  noExternal,
32
61
  gzipLevel,
33
- registry
62
+ registry,
63
+ platform
34
64
  });
65
+ // Store result in cache
66
+ setCachedResult(cacheKey, result);
35
67
  results.push({
36
68
  version,
37
69
  rawSize: result.rawSize,
@@ -55,17 +87,21 @@ import { TREND_VERSION_COUNT } from "./defaults.js";
55
87
  const lines = [];
56
88
  // Color helper (respects boring flag)
57
89
  const blue = (text)=>boring ? text : kleur.blue(text);
90
+ // Check if gzip data is available (null for node platform)
91
+ const hasGzipData = results.some((r)=>r.gzipSize !== null);
58
92
  // Create maps from formatted string to representative value
59
93
  // This ensures values that display the same get the same bar length
60
94
  const gzipFormattedToValue = new Map();
61
95
  const rawFormattedToValue = new Map();
62
96
  for (const result of results){
63
- const gzipFormatted = formatBytes(result.gzipSize);
64
- const rawFormatted = formatBytes(result.rawSize);
65
- // Use first occurrence as representative value for each formatted string
66
- if (!gzipFormattedToValue.has(gzipFormatted)) {
67
- gzipFormattedToValue.set(gzipFormatted, result.gzipSize);
97
+ if (hasGzipData && result.gzipSize !== null) {
98
+ const gzipFormatted = formatBytes(result.gzipSize);
99
+ // Use first occurrence as representative value for each formatted string
100
+ if (!gzipFormattedToValue.has(gzipFormatted)) {
101
+ gzipFormattedToValue.set(gzipFormatted, result.gzipSize);
102
+ }
68
103
  }
104
+ const rawFormatted = formatBytes(result.rawSize);
69
105
  if (!rawFormattedToValue.has(rawFormatted)) {
70
106
  rawFormattedToValue.set(rawFormatted, result.rawSize);
71
107
  }
@@ -77,8 +113,8 @@ import { TREND_VERSION_COUNT } from "./defaults.js";
77
113
  const uniqueRawValues = [
78
114
  ...rawFormattedToValue.values()
79
115
  ];
80
- const minGzipSize = Math.min(...uniqueGzipValues);
81
- const maxGzipSize = Math.max(...uniqueGzipValues);
116
+ const minGzipSize = hasGzipData ? Math.min(...uniqueGzipValues) : 0;
117
+ const maxGzipSize = hasGzipData ? Math.max(...uniqueGzipValues) : 0;
82
118
  const minRawSize = Math.min(...uniqueRawValues);
83
119
  const maxRawSize = Math.max(...uniqueRawValues);
84
120
  // Find max version length for alignment
@@ -100,18 +136,23 @@ import { TREND_VERSION_COUNT } from "./defaults.js";
100
136
  lines.push(`${blue("Bundle Size:")} ${packageName}`);
101
137
  lines.push("─".repeat(60));
102
138
  lines.push("");
103
- // Gzip size bars
104
- lines.push(blue("Gzip Size:"));
105
- for (const result of results){
106
- const sizeStr = formatBytes(result.gzipSize);
107
- // Use representative value for this formatted string to ensure consistent bar length
108
- const representativeValue = gzipFormattedToValue.get(sizeStr);
109
- const barLength = calcBarLength(representativeValue, minGzipSize, maxGzipSize);
110
- const bar = "▇".repeat(barLength);
111
- const padding = " ".repeat(maxVersionLen - result.version.length);
112
- lines.push(` ${result.version}${padding} ${bar} ${sizeStr}`);
139
+ // Gzip size bars (only for browser platform)
140
+ if (hasGzipData) {
141
+ lines.push(blue("Gzip Size:"));
142
+ for (const result of results){
143
+ if (result.gzipSize === null) {
144
+ continue;
145
+ }
146
+ const sizeStr = formatBytes(result.gzipSize);
147
+ // Use representative value for this formatted string to ensure consistent bar length
148
+ const representativeValue = gzipFormattedToValue.get(sizeStr);
149
+ const barLength = calcBarLength(representativeValue, minGzipSize, maxGzipSize);
150
+ const bar = "▇".repeat(barLength);
151
+ const padding = " ".repeat(maxVersionLen - result.version.length);
152
+ lines.push(` ${result.version}${padding} ${bar} ${sizeStr}`);
153
+ }
154
+ lines.push("");
113
155
  }
114
- lines.push("");
115
156
  // Raw size bars
116
157
  lines.push(blue("Raw Size:"));
117
158
  for (const result of results){
@@ -128,15 +169,18 @@ import { TREND_VERSION_COUNT } from "./defaults.js";
128
169
  const oldestResult = results[results.length - 1];
129
170
  const newestResult = results[0];
130
171
  if (results.length > 1) {
131
- const gzipDiff = newestResult.gzipSize - oldestResult.gzipSize;
132
- const gzipPercent = (gzipDiff / oldestResult.gzipSize * 100).toFixed(1);
133
172
  const rawDiff = newestResult.rawSize - oldestResult.rawSize;
134
173
  const rawPercent = (rawDiff / oldestResult.rawSize * 100).toFixed(1);
135
- const gzipTrend = gzipDiff >= 0 ? `+${formatBytes(gzipDiff)}` : `-${formatBytes(Math.abs(gzipDiff))}`;
136
174
  const rawTrend = rawDiff >= 0 ? `+${formatBytes(rawDiff)}` : `-${formatBytes(Math.abs(rawDiff))}`;
137
175
  lines.push("─".repeat(60));
138
176
  lines.push(`Change from ${oldestResult.version} to ${newestResult.version}:`);
139
- lines.push(` ${blue("Gzip:")} ${gzipTrend} (${gzipDiff >= 0 ? "+" : ""}${gzipPercent}%)`);
177
+ // Gzip summary (only for browser platform)
178
+ if (hasGzipData && newestResult.gzipSize !== null && oldestResult.gzipSize !== null) {
179
+ const gzipDiff = newestResult.gzipSize - oldestResult.gzipSize;
180
+ const gzipPercent = (gzipDiff / oldestResult.gzipSize * 100).toFixed(1);
181
+ const gzipTrend = gzipDiff >= 0 ? `+${formatBytes(gzipDiff)}` : `-${formatBytes(Math.abs(gzipDiff))}`;
182
+ lines.push(` ${blue("Gzip:")} ${gzipTrend} (${gzipDiff >= 0 ? "+" : ""}${gzipPercent}%)`);
183
+ }
140
184
  lines.push(` ${blue("Raw:")} ${rawTrend} (${rawDiff >= 0 ? "+" : ""}${rawPercent}%)`);
141
185
  }
142
186
  lines.push("");
package/dist/trend.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/trend.ts"],"sourcesContent":["import { Logger } from \"@node-cli/logger\";\nimport kleur from \"kleur\";\nimport { prerelease } from \"semver\";\nimport { checkBundleSize, formatBytes } from \"./bundler.js\";\nimport { TREND_VERSION_COUNT } from \"./defaults.js\";\n\nexport type TrendResult = {\n\tversion: string;\n\trawSize: number;\n\tgzipSize: number;\n};\n\nexport type TrendOptions = {\n\tpackageName: string;\n\tversions: string[];\n\texports?: string[];\n\tadditionalExternals?: string[];\n\tnoExternal?: boolean;\n\tgzipLevel?: number;\n\tboring?: boolean;\n\tregistry?: string;\n};\n\n/**\n * Select versions for trend analysis\n * Returns the most recent stable versions (newest first)\n * Filters out prerelease versions (canary, alpha, beta, rc, etc.)\n */\nexport function selectTrendVersions(\n\tallVersions: string[],\n\tcount: number = TREND_VERSION_COUNT,\n): string[] {\n\t// Filter out prerelease versions (canary, alpha, beta, rc, etc.)\n\tconst stableVersions = allVersions.filter((v) => !prerelease(v));\n\treturn stableVersions.slice(0, count);\n}\n\n/**\n * Analyze bundle size trend across multiple versions\n */\nexport async function analyzeTrend(\n\toptions: TrendOptions,\n): Promise<TrendResult[]> {\n\tconst {\n\t\tpackageName,\n\t\tversions,\n\t\texports,\n\t\tadditionalExternals,\n\t\tnoExternal,\n\t\tgzipLevel,\n\t\tboring,\n\t\tregistry,\n\t} = options;\n\n\tconst log = new Logger({ boring });\n\tconst results: TrendResult[] = [];\n\n\tfor (const version of versions) {\n\t\tconst versionedPackage = `${packageName}@${version}`;\n\t\tlog.info(` Checking ${version}...`);\n\n\t\ttry {\n\t\t\tconst result = await checkBundleSize({\n\t\t\t\tpackageName: versionedPackage,\n\t\t\t\texports,\n\t\t\t\tadditionalExternals,\n\t\t\t\tnoExternal,\n\t\t\t\tgzipLevel,\n\t\t\t\tregistry,\n\t\t\t});\n\n\t\t\tresults.push({\n\t\t\t\tversion,\n\t\t\t\trawSize: result.rawSize,\n\t\t\t\tgzipSize: result.gzipSize,\n\t\t\t});\n\t\t} catch {\n\t\t\t// Skip versions that fail to analyze\n\t\t\tlog.info(` Skipping ${version} (failed to analyze)`);\n\t\t}\n\t}\n\n\treturn results;\n}\n\n/**\n * Render a bar graph showing bundle size trend\n */\nexport function renderTrendGraph(\n\tpackageName: string,\n\tresults: TrendResult[],\n\tboring: boolean = false,\n): string[] {\n\tif (results.length === 0) {\n\t\treturn [\"No data to display\"];\n\t}\n\n\tconst lines: string[] = [];\n\n\t// Color helper (respects boring flag)\n\tconst blue = (text: string) => (boring ? text : kleur.blue(text));\n\n\t// Create maps from formatted string to representative value\n\t// This ensures values that display the same get the same bar length\n\tconst gzipFormattedToValue = new Map<string, number>();\n\tconst rawFormattedToValue = new Map<string, number>();\n\n\tfor (const result of results) {\n\t\tconst gzipFormatted = formatBytes(result.gzipSize);\n\t\tconst rawFormatted = formatBytes(result.rawSize);\n\t\t// Use first occurrence as representative value for each formatted string\n\t\tif (!gzipFormattedToValue.has(gzipFormatted)) {\n\t\t\tgzipFormattedToValue.set(gzipFormatted, result.gzipSize);\n\t\t}\n\t\tif (!rawFormattedToValue.has(rawFormatted)) {\n\t\t\trawFormattedToValue.set(rawFormatted, result.rawSize);\n\t\t}\n\t}\n\n\t// Get unique representative values for min/max calculation\n\tconst uniqueGzipValues = [...gzipFormattedToValue.values()];\n\tconst uniqueRawValues = [...rawFormattedToValue.values()];\n\n\tconst minGzipSize = Math.min(...uniqueGzipValues);\n\tconst maxGzipSize = Math.max(...uniqueGzipValues);\n\tconst minRawSize = Math.min(...uniqueRawValues);\n\tconst maxRawSize = Math.max(...uniqueRawValues);\n\n\t// Find max version length for alignment\n\tconst maxVersionLen = Math.max(...results.map((r) => r.version.length));\n\n\t// Bar width (characters)\n\tconst barWidth = 30;\n\tconst minBarWidth = 10; // Minimum bar length for smallest value\n\n\t// Helper to calculate bar length with min-max scaling\n\tconst calcBarLength = (value: number, min: number, max: number): number => {\n\t\tif (max === min) {\n\t\t\treturn barWidth; // All values are the same\n\t\t}\n\t\t// Scale from minBarWidth to barWidth based on position between min and max\n\t\tconst ratio = (value - min) / (max - min);\n\t\treturn Math.round(minBarWidth + ratio * (barWidth - minBarWidth));\n\t};\n\n\t// Header\n\tlines.push(\"\");\n\tlines.push(`${blue(\"Bundle Size:\")} ${packageName}`);\n\tlines.push(\"─\".repeat(60));\n\tlines.push(\"\");\n\n\t// Gzip size bars\n\tlines.push(blue(\"Gzip Size:\"));\n\tfor (const result of results) {\n\t\tconst sizeStr = formatBytes(result.gzipSize);\n\t\t// Use representative value for this formatted string to ensure consistent bar length\n\t\tconst representativeValue = gzipFormattedToValue.get(sizeStr) as number;\n\t\tconst barLength = calcBarLength(\n\t\t\trepresentativeValue,\n\t\t\tminGzipSize,\n\t\t\tmaxGzipSize,\n\t\t);\n\t\tconst bar = \"▇\".repeat(barLength);\n\t\tconst padding = \" \".repeat(maxVersionLen - result.version.length);\n\t\tlines.push(` ${result.version}${padding} ${bar} ${sizeStr}`);\n\t}\n\n\tlines.push(\"\");\n\n\t// Raw size bars\n\tlines.push(blue(\"Raw Size:\"));\n\tfor (const result of results) {\n\t\tconst sizeStr = formatBytes(result.rawSize);\n\t\t// Use representative value for this formatted string to ensure consistent bar length\n\t\tconst representativeValue = rawFormattedToValue.get(sizeStr) as number;\n\t\tconst barLength = calcBarLength(\n\t\t\trepresentativeValue,\n\t\t\tminRawSize,\n\t\t\tmaxRawSize,\n\t\t);\n\t\tconst bar = \"▇\".repeat(barLength);\n\t\tconst padding = \" \".repeat(maxVersionLen - result.version.length);\n\t\tlines.push(` ${result.version}${padding} ${bar} ${sizeStr}`);\n\t}\n\n\tlines.push(\"\");\n\n\t// Summary\n\tconst oldestResult = results[results.length - 1];\n\tconst newestResult = results[0];\n\n\tif (results.length > 1) {\n\t\tconst gzipDiff = newestResult.gzipSize - oldestResult.gzipSize;\n\t\tconst gzipPercent = ((gzipDiff / oldestResult.gzipSize) * 100).toFixed(1);\n\t\tconst rawDiff = newestResult.rawSize - oldestResult.rawSize;\n\t\tconst rawPercent = ((rawDiff / oldestResult.rawSize) * 100).toFixed(1);\n\n\t\tconst gzipTrend =\n\t\t\tgzipDiff >= 0\n\t\t\t\t? `+${formatBytes(gzipDiff)}`\n\t\t\t\t: `-${formatBytes(Math.abs(gzipDiff))}`;\n\t\tconst rawTrend =\n\t\t\trawDiff >= 0\n\t\t\t\t? `+${formatBytes(rawDiff)}`\n\t\t\t\t: `-${formatBytes(Math.abs(rawDiff))}`;\n\n\t\tlines.push(\"─\".repeat(60));\n\t\tlines.push(\n\t\t\t`Change from ${oldestResult.version} to ${newestResult.version}:`,\n\t\t);\n\t\tlines.push(\n\t\t\t` ${blue(\"Gzip:\")} ${gzipTrend} (${gzipDiff >= 0 ? \"+\" : \"\"}${gzipPercent}%)`,\n\t\t);\n\t\tlines.push(\n\t\t\t` ${blue(\"Raw:\")} ${rawTrend} (${rawDiff >= 0 ? \"+\" : \"\"}${rawPercent}%)`,\n\t\t);\n\t}\n\n\tlines.push(\"\");\n\n\treturn lines;\n}\n"],"names":["Logger","kleur","prerelease","checkBundleSize","formatBytes","TREND_VERSION_COUNT","selectTrendVersions","allVersions","count","stableVersions","filter","v","slice","analyzeTrend","options","packageName","versions","exports","additionalExternals","noExternal","gzipLevel","boring","registry","log","results","version","versionedPackage","info","result","push","rawSize","gzipSize","renderTrendGraph","length","lines","blue","text","gzipFormattedToValue","Map","rawFormattedToValue","gzipFormatted","rawFormatted","has","set","uniqueGzipValues","values","uniqueRawValues","minGzipSize","Math","min","maxGzipSize","max","minRawSize","maxRawSize","maxVersionLen","map","r","barWidth","minBarWidth","calcBarLength","value","ratio","round","repeat","sizeStr","representativeValue","get","barLength","bar","padding","oldestResult","newestResult","gzipDiff","gzipPercent","toFixed","rawDiff","rawPercent","gzipTrend","abs","rawTrend"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/trend.ts"],"sourcesContent":["import { Logger } from \"@node-cli/logger\";\nimport kleur from \"kleur\";\nimport { prerelease } from \"semver\";\nimport {\n\tcheckBundleSize,\n\tformatBytes,\n\tgetExternals,\n\tparsePackageSpecifier,\n} from \"./bundler.js\";\nimport {\n\tgetCachedResult,\n\tnormalizeCacheKey,\n\tsetCachedResult,\n} from \"./cache.js\";\nimport { TREND_VERSION_COUNT } from \"./defaults.js\";\n\nexport type TrendResult = {\n\tversion: string;\n\trawSize: number;\n\t/** Gzip size in bytes, or null for node platform */\n\tgzipSize: number | null;\n};\n\nexport type TrendOptions = {\n\tpackageName: string;\n\tversions: string[];\n\texports?: string[];\n\tadditionalExternals?: string[];\n\tnoExternal?: boolean;\n\tgzipLevel?: number;\n\tboring?: boolean;\n\tregistry?: string;\n\t/** Target platform. If undefined, auto-detects from package.json engines */\n\tplatform?: \"browser\" | \"node\";\n\t/** Bypass cache and force re-fetch/re-calculation */\n\tforce?: boolean;\n};\n\n/**\n * Select versions for trend analysis\n * Returns the most recent stable versions (newest first)\n * Filters out prerelease versions (canary, alpha, beta, rc, etc.)\n */\nexport function selectTrendVersions(\n\tallVersions: string[],\n\tcount: number = TREND_VERSION_COUNT,\n): string[] {\n\t// Filter out prerelease versions (canary, alpha, beta, rc, etc.)\n\tconst stableVersions = allVersions.filter((v) => !prerelease(v));\n\treturn stableVersions.slice(0, count);\n}\n\n/**\n * Analyze bundle size trend across multiple versions\n */\nexport async function analyzeTrend(\n\toptions: TrendOptions,\n): Promise<TrendResult[]> {\n\tconst {\n\t\tpackageName,\n\t\tversions,\n\t\texports,\n\t\tadditionalExternals,\n\t\tnoExternal,\n\t\tgzipLevel,\n\t\tboring,\n\t\tregistry,\n\t\tplatform,\n\t\tforce,\n\t} = options;\n\n\tconst log = new Logger({ boring });\n\tconst results: TrendResult[] = [];\n\n\t// Parse base package name (without version)\n\tconst { name: baseName } = parsePackageSpecifier(packageName);\n\n\t// Compute externals for cache key (same logic as bundler)\n\tconst externals = getExternals(baseName, additionalExternals, noExternal);\n\n\tfor (const version of versions) {\n\t\tconst versionedPackage = `${packageName}@${version}`;\n\n\t\t// Build cache key for this version\n\t\t// Note: platform can be undefined (auto-detect), which is stored as \"auto\" in cache\n\t\tconst cacheKey = normalizeCacheKey({\n\t\t\tpackageName: baseName,\n\t\t\tversion,\n\t\t\texports,\n\t\t\tplatform,\n\t\t\tgzipLevel: gzipLevel ?? 5,\n\t\t\texternals,\n\t\t\tnoExternal: noExternal ?? false,\n\t\t});\n\n\t\t// Check cache first (unless --force flag is set)\n\t\tif (!force) {\n\t\t\tconst cached = getCachedResult(cacheKey);\n\t\t\tif (cached) {\n\t\t\t\tlog.info(` Checking ${version}... (cached)`);\n\t\t\t\tresults.push({\n\t\t\t\t\tversion,\n\t\t\t\t\trawSize: cached.rawSize,\n\t\t\t\t\tgzipSize: cached.gzipSize,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tlog.info(` Checking ${version}...`);\n\n\t\ttry {\n\t\t\tconst result = await checkBundleSize({\n\t\t\t\tpackageName: versionedPackage,\n\t\t\t\texports,\n\t\t\t\tadditionalExternals,\n\t\t\t\tnoExternal,\n\t\t\t\tgzipLevel,\n\t\t\t\tregistry,\n\t\t\t\tplatform,\n\t\t\t});\n\n\t\t\t// Store result in cache\n\t\t\tsetCachedResult(cacheKey, result);\n\n\t\t\tresults.push({\n\t\t\t\tversion,\n\t\t\t\trawSize: result.rawSize,\n\t\t\t\tgzipSize: result.gzipSize,\n\t\t\t});\n\t\t} catch {\n\t\t\t// Skip versions that fail to analyze\n\t\t\tlog.info(` Skipping ${version} (failed to analyze)`);\n\t\t}\n\t}\n\n\treturn results;\n}\n\n/**\n * Render a bar graph showing bundle size trend\n */\nexport function renderTrendGraph(\n\tpackageName: string,\n\tresults: TrendResult[],\n\tboring: boolean = false,\n): string[] {\n\tif (results.length === 0) {\n\t\treturn [\"No data to display\"];\n\t}\n\n\tconst lines: string[] = [];\n\n\t// Color helper (respects boring flag)\n\tconst blue = (text: string) => (boring ? text : kleur.blue(text));\n\n\t// Check if gzip data is available (null for node platform)\n\tconst hasGzipData = results.some((r) => r.gzipSize !== null);\n\n\t// Create maps from formatted string to representative value\n\t// This ensures values that display the same get the same bar length\n\tconst gzipFormattedToValue = new Map<string, number>();\n\tconst rawFormattedToValue = new Map<string, number>();\n\n\tfor (const result of results) {\n\t\tif (hasGzipData && result.gzipSize !== null) {\n\t\t\tconst gzipFormatted = formatBytes(result.gzipSize);\n\t\t\t// Use first occurrence as representative value for each formatted string\n\t\t\tif (!gzipFormattedToValue.has(gzipFormatted)) {\n\t\t\t\tgzipFormattedToValue.set(gzipFormatted, result.gzipSize);\n\t\t\t}\n\t\t}\n\t\tconst rawFormatted = formatBytes(result.rawSize);\n\t\tif (!rawFormattedToValue.has(rawFormatted)) {\n\t\t\trawFormattedToValue.set(rawFormatted, result.rawSize);\n\t\t}\n\t}\n\n\t// Get unique representative values for min/max calculation\n\tconst uniqueGzipValues = [...gzipFormattedToValue.values()];\n\tconst uniqueRawValues = [...rawFormattedToValue.values()];\n\n\tconst minGzipSize = hasGzipData ? Math.min(...uniqueGzipValues) : 0;\n\tconst maxGzipSize = hasGzipData ? Math.max(...uniqueGzipValues) : 0;\n\tconst minRawSize = Math.min(...uniqueRawValues);\n\tconst maxRawSize = Math.max(...uniqueRawValues);\n\n\t// Find max version length for alignment\n\tconst maxVersionLen = Math.max(...results.map((r) => r.version.length));\n\n\t// Bar width (characters)\n\tconst barWidth = 30;\n\tconst minBarWidth = 10; // Minimum bar length for smallest value\n\n\t// Helper to calculate bar length with min-max scaling\n\tconst calcBarLength = (value: number, min: number, max: number): number => {\n\t\tif (max === min) {\n\t\t\treturn barWidth; // All values are the same\n\t\t}\n\t\t// Scale from minBarWidth to barWidth based on position between min and max\n\t\tconst ratio = (value - min) / (max - min);\n\t\treturn Math.round(minBarWidth + ratio * (barWidth - minBarWidth));\n\t};\n\n\t// Header\n\tlines.push(\"\");\n\tlines.push(`${blue(\"Bundle Size:\")} ${packageName}`);\n\tlines.push(\"─\".repeat(60));\n\tlines.push(\"\");\n\n\t// Gzip size bars (only for browser platform)\n\tif (hasGzipData) {\n\t\tlines.push(blue(\"Gzip Size:\"));\n\t\tfor (const result of results) {\n\t\t\tif (result.gzipSize === null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst sizeStr = formatBytes(result.gzipSize);\n\t\t\t// Use representative value for this formatted string to ensure consistent bar length\n\t\t\tconst representativeValue = gzipFormattedToValue.get(sizeStr) as number;\n\t\t\tconst barLength = calcBarLength(\n\t\t\t\trepresentativeValue,\n\t\t\t\tminGzipSize,\n\t\t\t\tmaxGzipSize,\n\t\t\t);\n\t\t\tconst bar = \"▇\".repeat(barLength);\n\t\t\tconst padding = \" \".repeat(maxVersionLen - result.version.length);\n\t\t\tlines.push(` ${result.version}${padding} ${bar} ${sizeStr}`);\n\t\t}\n\n\t\tlines.push(\"\");\n\t}\n\n\t// Raw size bars\n\tlines.push(blue(\"Raw Size:\"));\n\tfor (const result of results) {\n\t\tconst sizeStr = formatBytes(result.rawSize);\n\t\t// Use representative value for this formatted string to ensure consistent bar length\n\t\tconst representativeValue = rawFormattedToValue.get(sizeStr) as number;\n\t\tconst barLength = calcBarLength(\n\t\t\trepresentativeValue,\n\t\t\tminRawSize,\n\t\t\tmaxRawSize,\n\t\t);\n\t\tconst bar = \"▇\".repeat(barLength);\n\t\tconst padding = \" \".repeat(maxVersionLen - result.version.length);\n\t\tlines.push(` ${result.version}${padding} ${bar} ${sizeStr}`);\n\t}\n\n\tlines.push(\"\");\n\n\t// Summary\n\tconst oldestResult = results[results.length - 1];\n\tconst newestResult = results[0];\n\n\tif (results.length > 1) {\n\t\tconst rawDiff = newestResult.rawSize - oldestResult.rawSize;\n\t\tconst rawPercent = ((rawDiff / oldestResult.rawSize) * 100).toFixed(1);\n\t\tconst rawTrend =\n\t\t\trawDiff >= 0\n\t\t\t\t? `+${formatBytes(rawDiff)}`\n\t\t\t\t: `-${formatBytes(Math.abs(rawDiff))}`;\n\n\t\tlines.push(\"─\".repeat(60));\n\t\tlines.push(\n\t\t\t`Change from ${oldestResult.version} to ${newestResult.version}:`,\n\t\t);\n\n\t\t// Gzip summary (only for browser platform)\n\t\tif (\n\t\t\thasGzipData &&\n\t\t\tnewestResult.gzipSize !== null &&\n\t\t\toldestResult.gzipSize !== null\n\t\t) {\n\t\t\tconst gzipDiff = newestResult.gzipSize - oldestResult.gzipSize;\n\t\t\tconst gzipPercent = ((gzipDiff / oldestResult.gzipSize) * 100).toFixed(1);\n\t\t\tconst gzipTrend =\n\t\t\t\tgzipDiff >= 0\n\t\t\t\t\t? `+${formatBytes(gzipDiff)}`\n\t\t\t\t\t: `-${formatBytes(Math.abs(gzipDiff))}`;\n\t\t\tlines.push(\n\t\t\t\t` ${blue(\"Gzip:\")} ${gzipTrend} (${gzipDiff >= 0 ? \"+\" : \"\"}${gzipPercent}%)`,\n\t\t\t);\n\t\t}\n\n\t\tlines.push(\n\t\t\t` ${blue(\"Raw:\")} ${rawTrend} (${rawDiff >= 0 ? \"+\" : \"\"}${rawPercent}%)`,\n\t\t);\n\t}\n\n\tlines.push(\"\");\n\n\treturn lines;\n}\n"],"names":["Logger","kleur","prerelease","checkBundleSize","formatBytes","getExternals","parsePackageSpecifier","getCachedResult","normalizeCacheKey","setCachedResult","TREND_VERSION_COUNT","selectTrendVersions","allVersions","count","stableVersions","filter","v","slice","analyzeTrend","options","packageName","versions","exports","additionalExternals","noExternal","gzipLevel","boring","registry","platform","force","log","results","name","baseName","externals","version","versionedPackage","cacheKey","cached","info","push","rawSize","gzipSize","result","renderTrendGraph","length","lines","blue","text","hasGzipData","some","r","gzipFormattedToValue","Map","rawFormattedToValue","gzipFormatted","has","set","rawFormatted","uniqueGzipValues","values","uniqueRawValues","minGzipSize","Math","min","maxGzipSize","max","minRawSize","maxRawSize","maxVersionLen","map","barWidth","minBarWidth","calcBarLength","value","ratio","round","repeat","sizeStr","representativeValue","get","barLength","bar","padding","oldestResult","newestResult","rawDiff","rawPercent","toFixed","rawTrend","abs","gzipDiff","gzipPercent","gzipTrend"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-cli/bundlecheck",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "license": "MIT",
5
5
  "author": "Arno Versini",
6
6
  "description": "CLI tool to check the bundle size of npm packages (like bundlephobia)",
@@ -36,6 +36,7 @@
36
36
  "@inquirer/select": "5.0.4",
37
37
  "@node-cli/logger": "1.3.4",
38
38
  "@node-cli/parser": "2.4.5",
39
+ "better-sqlite3": "12.6.2",
39
40
  "esbuild": "0.27.2",
40
41
  "kleur": "4.1.5",
41
42
  "semver": "7.7.3"
@@ -45,8 +46,9 @@
45
46
  },
46
47
  "devDependencies": {
47
48
  "@node-cli/comments": "0.2.9",
49
+ "@types/better-sqlite3": "7.6.13",
48
50
  "@vitest/coverage-v8": "4.0.18",
49
51
  "vitest": "4.0.18"
50
52
  },
51
- "gitHead": "82338f6450ba5ce414dadef36a1a46966868548c"
53
+ "gitHead": "fcc52d3d0cdc71e5065bbbc8a0cd064c1a487f9f"
52
54
  }