Skip to content

Commit 1fdb3cb

Browse files
committed
feat: account for removed packages in install size
1 parent 4045341 commit 1fdb3cb

File tree

4 files changed

+132
-46
lines changed

4 files changed

+132
-46
lines changed

build/main.js

Lines changed: 55 additions & 19 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 = {
@@ -24548,12 +24568,42 @@ function formatBytes(bytes) {
2454824568
}
2454924569

2455024570
// src/checks/dependency-size.ts
24551-
async function scanForDependencySize(messages, threshold, newVersions) {
24552-
if (newVersions.length === 0) {
24571+
async function scanForDependencySize(messages, threshold, currentDeps, baseDeps) {
24572+
const newVersions = [];
24573+
const removedVersions = [];
24574+
for (const [packageName, currentVersionSet] of currentDeps) {
24575+
const baseVersionSet = baseDeps.get(packageName);
24576+
for (const version of currentVersionSet) {
24577+
if (!baseVersionSet || !baseVersionSet.has(version)) {
24578+
newVersions.push({
24579+
name: packageName,
24580+
version,
24581+
isNewPackage: !baseVersionSet
24582+
});
24583+
}
24584+
}
24585+
}
24586+
for (const [packageName, baseVersionSet] of baseDeps) {
24587+
const currentVersionSet = currentDeps.get(packageName);
24588+
for (const version of baseVersionSet) {
24589+
if (!currentVersionSet || !currentVersionSet.has(version)) {
24590+
removedVersions.push({
24591+
name: packageName,
24592+
version
24593+
});
24594+
}
24595+
}
24596+
}
24597+
core5.info(`Found ${newVersions.length} new package versions`);
24598+
core5.info(`Found ${removedVersions.length} removed package versions.`);
24599+
if (newVersions.length === 0 && removedVersions.length === 0) {
2455324600
return;
2455424601
}
2455524602
try {
24556-
const sizeData = await calculateTotalDependencySizeIncrease(newVersions);
24603+
const sizeData = await calculateTotalDependencySizeIncrease(
24604+
newVersions,
24605+
removedVersions
24606+
);
2455724607
if (sizeData !== null && sizeData.totalSize >= threshold) {
2455824608
const packageRows = Array.from(sizeData.packageSizes.entries()).sort(([, a], [, b]) => b - a).map(([pkg, size]) => `| ${pkg} | ${formatBytes(size)} |`).join("\n");
2455924609
messages.push(
@@ -24728,21 +24778,7 @@ async function run() {
2472824778
baseDeps
2472924779
);
2473024780
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);
24781+
await scanForDependencySize(messages, sizeThreshold, currentDeps, baseDeps);
2474624782
await scanForProvenance(messages, currentDeps, baseDeps);
2474724783
const basePackagesPattern = core7.getInput("base-packages");
2474824784
const sourcePackagesPattern = core7.getInput("source-packages");

src/checks/dependency-size.ts

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,58 @@ 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+
);
1560

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

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)