Skip to content

Commit 23c6002

Browse files
authored
feat: account for removed packages in install size (#44)
* feat: account for removed packages in install size * chore: add logging * fix: allow negative bytes
1 parent 4045341 commit 23c6002

File tree

5 files changed

+149
-50
lines changed

5 files changed

+149
-50
lines changed

build/main.js

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24237,7 +24237,7 @@ async function fetchPackageMetadata(packageName, version) {
2423724237
metaCache.set(cacheKey, result);
2423824238
return result;
2423924239
}
24240-
async function calculateTotalDependencySizeIncrease(newVersions) {
24240+
async function calculateTotalDependencySizeIncrease(newVersions, removedVersions) {
2424124241
let totalSize = 0;
2424224242
const processedPackages = /* @__PURE__ */ new Set();
2424324243
const packageSizes = /* @__PURE__ */ new Map();
@@ -24259,6 +24259,26 @@ async function calculateTotalDependencySizeIncrease(newVersions) {
2425924259
return null;
2426024260
}
2426124261
}
24262+
for (const dep of removedVersions) {
24263+
const packageKey = `${dep.name}@${dep.version}`;
24264+
if (processedPackages.has(packageKey)) {
24265+
continue;
24266+
}
24267+
try {
24268+
const metadata = await fetchPackageMetadata(dep.name, dep.version);
24269+
if (!metadata || metadata.dist?.unpackedSize === void 0) {
24270+
return null;
24271+
}
24272+
totalSize -= metadata.dist.unpackedSize;
24273+
packageSizes.set(packageKey, -metadata.dist.unpackedSize);
24274+
processedPackages.add(packageKey);
24275+
core2.info(
24276+
`Subtracted ${metadata.dist.unpackedSize} bytes for ${packageKey}`
24277+
);
24278+
} catch {
24279+
return null;
24280+
}
24281+
}
2426224282
return { totalSize, packageSizes };
2426324283
}
2426424284
var dependencyTypeMap = {
@@ -24541,19 +24561,54 @@ var core5 = __toESM(require_core(), 1);
2454124561
// src/common.ts
2454224562
function formatBytes(bytes) {
2454324563
if (bytes === 0) return "0 B";
24564+
const absBytes = Math.abs(bytes);
2454424565
const k = 1e3;
2454524566
const sizes = ["B", "kB", "MB", "GB"];
24546-
const i = Math.floor(Math.log(bytes) / Math.log(k));
24547-
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
24567+
const i = Math.floor(Math.log(absBytes) / Math.log(k));
24568+
const byteValue = parseFloat((absBytes / Math.pow(k, i)).toFixed(1));
24569+
return `${bytes < 0 ? -byteValue : byteValue} ${sizes[i]}`;
2454824570
}
2454924571

2455024572
// src/checks/dependency-size.ts
24551-
async function scanForDependencySize(messages, threshold, newVersions) {
24552-
if (newVersions.length === 0) {
24573+
async function scanForDependencySize(messages, threshold, currentDeps, baseDeps) {
24574+
const newVersions = [];
24575+
const removedVersions = [];
24576+
for (const [packageName, currentVersionSet] of currentDeps) {
24577+
const baseVersionSet = baseDeps.get(packageName);
24578+
for (const version of currentVersionSet) {
24579+
if (!baseVersionSet || !baseVersionSet.has(version)) {
24580+
newVersions.push({
24581+
name: packageName,
24582+
version,
24583+
isNewPackage: !baseVersionSet
24584+
});
24585+
}
24586+
}
24587+
}
24588+
for (const [packageName, baseVersionSet] of baseDeps) {
24589+
const currentVersionSet = currentDeps.get(packageName);
24590+
for (const version of baseVersionSet) {
24591+
if (!currentVersionSet || !currentVersionSet.has(version)) {
24592+
removedVersions.push({
24593+
name: packageName,
24594+
version
24595+
});
24596+
}
24597+
}
24598+
}
24599+
core5.info(`Found ${newVersions.length} new package versions`);
24600+
core5.info(`Found ${removedVersions.length} removed package versions.`);
24601+
if (newVersions.length === 0 && removedVersions.length === 0) {
2455324602
return;
2455424603
}
2455524604
try {
24556-
const sizeData = await calculateTotalDependencySizeIncrease(newVersions);
24605+
const sizeData = await calculateTotalDependencySizeIncrease(
24606+
newVersions,
24607+
removedVersions
24608+
);
24609+
core5.info(
24610+
`Total dependency size increase: ${sizeData ? formatBytes(sizeData.totalSize) : "unknown"}`
24611+
);
2455724612
if (sizeData !== null && sizeData.totalSize >= threshold) {
2455824613
const packageRows = Array.from(sizeData.packageSizes.entries()).sort(([, a], [, b]) => b - a).map(([pkg, size]) => `| ${pkg} | ${formatBytes(size)} |`).join("\n");
2455924614
messages.push(
@@ -24728,21 +24783,7 @@ async function run() {
2472824783
baseDeps
2472924784
);
2473024785
scanForDuplicates(messages, duplicateThreshold, currentDeps, lockfilePath);
24731-
const newVersions = [];
24732-
for (const [packageName, currentVersionSet] of currentDeps) {
24733-
const baseVersionSet = baseDeps.get(packageName);
24734-
for (const version of currentVersionSet) {
24735-
if (!baseVersionSet || !baseVersionSet.has(version)) {
24736-
newVersions.push({
24737-
name: packageName,
24738-
version,
24739-
isNewPackage: !baseVersionSet
24740-
});
24741-
}
24742-
}
24743-
}
24744-
core7.info(`Found ${newVersions.length} new package versions`);
24745-
await scanForDependencySize(messages, sizeThreshold, newVersions);
24786+
await scanForDependencySize(messages, sizeThreshold, currentDeps, baseDeps);
2474624787
await scanForProvenance(messages, currentDeps, baseDeps);
2474724788
const basePackagesPattern = core7.getInput("base-packages");
2474824789
const sourcePackagesPattern = core7.getInput("source-packages");

src/checks/dependency-size.ts

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,64 @@ import {formatBytes} from '../common.js';
55
export async function scanForDependencySize(
66
messages: string[],
77
threshold: number,
8-
newVersions: Array<{name: string; version: string}>
8+
currentDeps: Map<string, Set<string>>,
9+
baseDeps: Map<string, Set<string>>
910
): Promise<void> {
10-
if (newVersions.length === 0) {
11+
const newVersions: Array<{
12+
name: string;
13+
version: string;
14+
isNewPackage: boolean;
15+
}> = [];
16+
const removedVersions: Array<{
17+
name: string;
18+
version: string;
19+
}> = [];
20+
21+
for (const [packageName, currentVersionSet] of currentDeps) {
22+
const baseVersionSet = baseDeps.get(packageName);
23+
24+
for (const version of currentVersionSet) {
25+
if (!baseVersionSet || !baseVersionSet.has(version)) {
26+
newVersions.push({
27+
name: packageName,
28+
version: version,
29+
isNewPackage: !baseVersionSet
30+
});
31+
}
32+
}
33+
}
34+
35+
for (const [packageName, baseVersionSet] of baseDeps) {
36+
const currentVersionSet = currentDeps.get(packageName);
37+
38+
for (const version of baseVersionSet) {
39+
if (!currentVersionSet || !currentVersionSet.has(version)) {
40+
removedVersions.push({
41+
name: packageName,
42+
version: version
43+
});
44+
}
45+
}
46+
}
47+
48+
core.info(`Found ${newVersions.length} new package versions`);
49+
core.info(`Found ${removedVersions.length} removed package versions.`);
50+
51+
if (newVersions.length === 0 && removedVersions.length === 0) {
1152
return;
1253
}
54+
1355
try {
14-
const sizeData = await calculateTotalDependencySizeIncrease(newVersions);
56+
const sizeData = await calculateTotalDependencySizeIncrease(
57+
newVersions,
58+
removedVersions
59+
);
60+
61+
core.info(
62+
`Total dependency size increase: ${
63+
sizeData ? formatBytes(sizeData.totalSize) : 'unknown'
64+
}`
65+
);
1566

1667
if (sizeData !== null && sizeData.totalSize >= threshold) {
1768
const packageRows = Array.from(sizeData.packageSizes.entries())

src/common.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
export function formatBytes(bytes: number): string {
22
if (bytes === 0) return '0 B';
3+
const absBytes = Math.abs(bytes);
34
const k = 1000;
45
const sizes = ['B', 'kB', 'MB', 'GB'];
5-
const i = Math.floor(Math.log(bytes) / Math.log(k));
6-
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
6+
const i = Math.floor(Math.log(absBytes) / Math.log(k));
7+
const byteValue = parseFloat((absBytes / Math.pow(k, i)).toFixed(1));
8+
return `${bytes < 0 ? -byteValue : byteValue} ${sizes[i]}`;
79
}

src/main.ts

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -105,29 +105,7 @@ async function run(): Promise<void> {
105105
);
106106
scanForDuplicates(messages, duplicateThreshold, currentDeps, lockfilePath);
107107

108-
const newVersions: Array<{
109-
name: string;
110-
version: string;
111-
isNewPackage: boolean;
112-
}> = [];
113-
114-
for (const [packageName, currentVersionSet] of currentDeps) {
115-
const baseVersionSet = baseDeps.get(packageName);
116-
117-
for (const version of currentVersionSet) {
118-
if (!baseVersionSet || !baseVersionSet.has(version)) {
119-
newVersions.push({
120-
name: packageName,
121-
version: version,
122-
isNewPackage: !baseVersionSet
123-
});
124-
}
125-
}
126-
}
127-
128-
core.info(`Found ${newVersions.length} new package versions`);
129-
130-
await scanForDependencySize(messages, sizeThreshold, newVersions);
108+
await scanForDependencySize(messages, sizeThreshold, currentDeps, baseDeps);
131109
await scanForProvenance(messages, currentDeps, baseDeps);
132110

133111
const basePackagesPattern = core.getInput('base-packages');

src/npm.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ export async function fetchPackageMetadata(
127127
}
128128

129129
export async function calculateTotalDependencySizeIncrease(
130-
newVersions: Array<{name: string; version: string}>
130+
newVersions: Array<{name: string; version: string}>,
131+
removedVersions: Array<{name: string; version: string}>
131132
): Promise<{totalSize: number; packageSizes: Map<string, number>} | null> {
132133
let totalSize = 0;
133134
const processedPackages = new Set<string>();
@@ -157,6 +158,32 @@ export async function calculateTotalDependencySizeIncrease(
157158
}
158159
}
159160

161+
for (const dep of removedVersions) {
162+
const packageKey = `${dep.name}@${dep.version}`;
163+
164+
if (processedPackages.has(packageKey)) {
165+
continue;
166+
}
167+
168+
try {
169+
const metadata = await fetchPackageMetadata(dep.name, dep.version);
170+
171+
if (!metadata || metadata.dist?.unpackedSize === undefined) {
172+
return null;
173+
}
174+
175+
totalSize -= metadata.dist.unpackedSize;
176+
packageSizes.set(packageKey, -metadata.dist.unpackedSize);
177+
processedPackages.add(packageKey);
178+
179+
core.info(
180+
`Subtracted ${metadata.dist.unpackedSize} bytes for ${packageKey}`
181+
);
182+
} catch {
183+
return null;
184+
}
185+
}
186+
160187
return {totalSize, packageSizes};
161188
}
162189

0 commit comments

Comments
 (0)