@@ -24170,6 +24170,30 @@ async function fetchPackageMetadata(packageName, version) {
24170
24170
return null;
24171
24171
}
24172
24172
}
24173
+ async function calculateTotalDependencySizeIncrease(newVersions) {
24174
+ let totalSize = 0;
24175
+ const processedPackages = /* @__PURE__ */ new Set();
24176
+ const packageSizes = /* @__PURE__ */ new Map();
24177
+ for (const dep of newVersions) {
24178
+ const packageKey = `${dep.name}@${dep.version}`;
24179
+ if (processedPackages.has(packageKey)) {
24180
+ continue;
24181
+ }
24182
+ try {
24183
+ const metadata = await fetchPackageMetadata(dep.name, dep.version);
24184
+ if (!metadata || metadata.dist?.unpackedSize === void 0) {
24185
+ return null;
24186
+ }
24187
+ totalSize += metadata.dist.unpackedSize;
24188
+ packageSizes.set(packageKey, metadata.dist.unpackedSize);
24189
+ processedPackages.add(packageKey);
24190
+ core2.info(`Added ${metadata.dist.unpackedSize} bytes for ${packageKey}`);
24191
+ } catch {
24192
+ return null;
24193
+ }
24194
+ }
24195
+ return { totalSize, packageSizes };
24196
+ }
24173
24197
24174
24198
// src/main.ts
24175
24199
function formatBytes(bytes) {
@@ -24180,6 +24204,21 @@ function formatBytes(bytes) {
24180
24204
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
24181
24205
}
24182
24206
var COMMENT_TAG = "<!-- dependency-diff-action -->";
24207
+ function getLsCommand(lockfilePath, packageName) {
24208
+ if (lockfilePath.endsWith("package-lock.json")) {
24209
+ return `npm ls ${packageName}`;
24210
+ }
24211
+ if (lockfilePath.endsWith("pnpm-lock.yaml")) {
24212
+ return `pnpm why ${packageName}`;
24213
+ }
24214
+ if (lockfilePath.endsWith("yarn.lock")) {
24215
+ return `yarn why ${packageName}`;
24216
+ }
24217
+ if (lockfilePath.endsWith("bun.lock")) {
24218
+ return `bun pm ls ${packageName}`;
24219
+ }
24220
+ return void 0;
24221
+ }
24183
24222
async function run() {
24184
24223
try {
24185
24224
const workspacePath = process2.env.GITHUB_WORKSPACE || process2.cwd();
@@ -24227,8 +24266,13 @@ async function run() {
24227
24266
core3.getInput("size-threshold") || "100000",
24228
24267
10
24229
24268
);
24269
+ const duplicateThreshold = parseInt(
24270
+ core3.getInput("duplicate-threshold") || "1",
24271
+ 10
24272
+ );
24230
24273
core3.info(`Dependency threshold set to ${dependencyThreshold}`);
24231
24274
core3.info(`Size threshold set to ${formatBytes(sizeThreshold)}`);
24275
+ core3.info(`Duplicate threshold set to ${duplicateThreshold}`);
24232
24276
const messages = [];
24233
24277
const currentDepCount = Array.from(currentDeps.values()).reduce(
24234
24278
(sum, versions) => sum + versions.size,
@@ -24247,6 +24291,26 @@ async function run() {
24247
24291
`\u26A0\uFE0F **Dependency Count Warning**: This PR adds ${depIncrease} new dependencies (${baseDepCount} \u2192 ${currentDepCount}), which exceeds the threshold of ${dependencyThreshold}.`
24248
24292
);
24249
24293
}
24294
+ const duplicateWarnings = [];
24295
+ for (const [packageName, currentVersionSet] of currentDeps) {
24296
+ if (currentVersionSet.size > duplicateThreshold) {
24297
+ const versions = Array.from(currentVersionSet).sort();
24298
+ duplicateWarnings.push(
24299
+ `\u{1F4E6} **${packageName}**: ${currentVersionSet.size} versions (${versions.join(", ")})`
24300
+ );
24301
+ }
24302
+ }
24303
+ if (duplicateWarnings.length > 0) {
24304
+ const exampleCommand = getLsCommand(lockfilePath, "example-package");
24305
+ const helpMessage = exampleCommand ? `
24306
+
24307
+ \u{1F4A1} To find out what depends on a specific package, run: \`${exampleCommand}\`` : "";
24308
+ messages.push(
24309
+ `\u26A0\uFE0F **Duplicate Dependencies Warning** (threshold: ${duplicateThreshold}):
24310
+
24311
+ ${duplicateWarnings.join("\n")}${helpMessage}`
24312
+ );
24313
+ }
24250
24314
const newVersions = [];
24251
24315
for (const [packageName, currentVersionSet] of currentDeps) {
24252
24316
const baseVersionSet = baseDeps.get(packageName);
@@ -24262,28 +24326,20 @@ async function run() {
24262
24326
}
24263
24327
core3.info(`Found ${newVersions.length} new package versions`);
24264
24328
if (newVersions.length > 0) {
24265
- const sizeWarnings = [];
24266
- for (const dep of newVersions) {
24267
- try {
24268
- const metadata = await fetchPackageMetadata(dep.name, dep.version);
24269
- if (metadata?.dist?.unpackedSize && metadata.dist.unpackedSize >= sizeThreshold) {
24270
- const label = dep.isNewPackage ? "new package" : "new version";
24271
- sizeWarnings.push(
24272
- `\u{1F4E6} **${dep.name}@${dep.version}** (${label}): ${formatBytes(metadata.dist.unpackedSize)}`
24273
- );
24274
- }
24275
- } catch (err) {
24276
- core3.info(
24277
- `Failed to check size for ${dep.name}@${dep.version}: ${err}`
24329
+ try {
24330
+ const sizeData = await calculateTotalDependencySizeIncrease(newVersions);
24331
+ if (sizeData !== null && sizeData.totalSize >= sizeThreshold) {
24332
+ const packageRows = Array.from(sizeData.packageSizes.entries()).sort(([, a], [, b]) => b - a).map(([pkg, size]) => `| ${pkg} | ${formatBytes(size)} |`).join("\n");
24333
+ messages.push(
24334
+ `\u26A0\uFE0F **Large Dependency Size Increase**: This PR adds ${formatBytes(sizeData.totalSize)} of new dependencies, which exceeds the threshold of ${formatBytes(sizeThreshold)}.
24335
+
24336
+ | Package | Size |
24337
+ |---------|------|
24338
+ ${packageRows}`
24278
24339
);
24279
24340
}
24280
- }
24281
- if (sizeWarnings.length > 0) {
24282
- messages.push(
24283
- `\u26A0\uFE0F **Large Package Warnings** (threshold: ${formatBytes(sizeThreshold)}):
24284
-
24285
- ${sizeWarnings.join("\n")}`
24286
- );
24341
+ } catch (err) {
24342
+ core3.info(`Failed to calculate total dependency size increase: ${err}`);
24287
24343
}
24288
24344
}
24289
24345
if (messages.length === 0) {
0 commit comments