diff --git a/apps/frontend/src/components/ui/ProjectDownloadModal/DownloadDependencies.vue b/apps/frontend/src/components/ui/ProjectDownloadModal/DownloadDependencies.vue
index 184e9c92f9..d70ae48c27 100644
--- a/apps/frontend/src/components/ui/ProjectDownloadModal/DownloadDependencies.vue
+++ b/apps/frontend/src/components/ui/ProjectDownloadModal/DownloadDependencies.vue
@@ -4,7 +4,7 @@
{{ sectionTitle }}
(() =>
dedupeDependencyRows(dependencyRows.value),
)
+const duplicateDependencyRowsHidden = computed(() =>
+ hasDuplicateDependencyRows(dependencyRows.value),
+)
+
const additionalFileRows = computed(() =>
props.additionalFiles.map((file) => ({
key: `additional-file-${additionalFileKey(file)}`,
@@ -396,6 +400,20 @@ function dependencyRowIdentity(row: DownloadDependencyRow) {
return row.projectHref ?? row.downloadHref ?? row.key
}
+function hasDuplicateDependencyRows(
+ rows: DownloadDependencyRow[],
+ seenDependencies = new Set(),
+): boolean {
+ for (const row of rows) {
+ const rowId = dependencyRowIdentity(row)
+ if (seenDependencies.has(rowId)) return true
+ seenDependencies.add(rowId)
+ if (hasDuplicateDependencyRows(row.dependencies, seenDependencies)) return true
+ }
+
+ return false
+}
+
function collectDownloadableDependencyFiles(
rows: DownloadDependencyRow[],
seenHrefs = new Set(),