From 308237762bdac4f6de398499256315702db97808 Mon Sep 17 00:00:00 2001 From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com> Date: Wed, 27 May 2026 12:54:33 +0200 Subject: [PATCH 1/4] chore(eslint): enable @eslint-react/no-array-index-key rule Replace array index keys with stable identifiers: use string templates, file metadata, or map entry keys instead. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../TableControls/TableHeaderContentWithControls.tsx | 4 ++-- client/src/app/components/UploadFiles.tsx | 4 ++-- client/src/app/pages/package-list/package-table.tsx | 6 ++---- .../src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx | 6 +++--- .../pages/sbom-scan/components/UploadFileForAnalysis.tsx | 4 ++-- eslint.config.mjs | 1 - 6 files changed, 11 insertions(+), 14 deletions(-) diff --git a/client/src/app/components/TableControls/TableHeaderContentWithControls.tsx b/client/src/app/components/TableControls/TableHeaderContentWithControls.tsx index 0eb0a60bb..a9c0f6383 100644 --- a/client/src/app/components/TableControls/TableHeaderContentWithControls.tsx +++ b/client/src/app/components/TableControls/TableHeaderContentWithControls.tsx @@ -15,13 +15,13 @@ export const TableHeaderContentWithControls: React.FC< {Array(numColumnsBeforeData) .fill(null) .map((_, i) => ( - + ))} {children} {Array(numColumnsAfterData) .fill(null) .map((_, i) => ( - + ))} ); diff --git a/client/src/app/components/UploadFiles.tsx b/client/src/app/components/UploadFiles.tsx index d4f161456..972ab438e 100644 --- a/client/src/app/components/UploadFiles.tsx +++ b/client/src/app/components/UploadFiles.tsx @@ -118,13 +118,13 @@ export const UploadFiles: React.FC = ({ statusToggleText={`${successFileCount} of ${uploads.size} files uploaded`} statusToggleIcon={statusIcon} > - {Array.from(uploads.entries()).map(([file, upload], index) => ( + {Array.from(uploads.entries()).map(([file, upload]) => ( {}} fileIcon={} file={file} - key={`${file.name}-${index}`} + key={`${file.name}-${file.size}-${file.lastModified}`} onClearClick={() => removeFiles([file])} progressValue={upload.progress} progressVariant={ diff --git a/client/src/app/pages/package-list/package-table.tsx b/client/src/app/pages/package-list/package-table.tsx index e6323f9d5..36baf89e6 100644 --- a/client/src/app/pages/package-list/package-table.tsx +++ b/client/src/app/pages/package-list/package-table.tsx @@ -170,10 +170,8 @@ export const PackageTable: React.FC = () => {
{isCellExpanded(item, "licenses") ? ( - {pkg?.licenses?.map((license, idx) => ( - + {pkg?.licenses?.map((license) => ( + {license.license_name} ))} diff --git a/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx b/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx index d88941f8d..b8115fdaa 100644 --- a/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx +++ b/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx @@ -352,8 +352,8 @@ export const VulnerabilitiesBySbom: React.FC = ({ - {Array.from(item.purls.values()).map( - (purl, index) => { + {Array.from(item.purls.entries()).map( + ([purlKey, purl]) => { if (!purl.isOrphan) { const decomposedPurl = decomposePurl( purl.purlSummary.purl, @@ -391,7 +391,7 @@ export const VulnerabilitiesBySbom: React.FC = ({ } else { return ( diff --git a/client/src/app/pages/sbom-scan/components/UploadFileForAnalysis.tsx b/client/src/app/pages/sbom-scan/components/UploadFileForAnalysis.tsx index 948c5cb80..432987388 100644 --- a/client/src/app/pages/sbom-scan/components/UploadFileForAnalysis.tsx +++ b/client/src/app/pages/sbom-scan/components/UploadFileForAnalysis.tsx @@ -77,12 +77,12 @@ export const UploadFileForAnalysis: React.FC = ({ browseButtonText="Browse Files" /> ) : ( - Array.from(uploads.entries()).map(([file, upload], index) => { + Array.from(uploads.entries()).map((\1) => { if (upload.error) { if (upload.wasCancelled) { return ( Date: Wed, 27 May 2026 13:58:40 +0200 Subject: [PATCH 2/4] fix: repair corrupted file and suppress index key for filler cells - Fix UploadFileForAnalysis.tsx corrupted by sed (restore destructuring, replace index keys with file.size) - Suppress no-array-index-key for filler Th cells that have no identity beyond position Co-Authored-By: Claude Opus 4.6 (1M context) --- .../TableControls/TableHeaderContentWithControls.tsx | 6 ++++-- .../pages/sbom-scan/components/UploadFileForAnalysis.tsx | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/client/src/app/components/TableControls/TableHeaderContentWithControls.tsx b/client/src/app/components/TableControls/TableHeaderContentWithControls.tsx index a9c0f6383..08becda3a 100644 --- a/client/src/app/components/TableControls/TableHeaderContentWithControls.tsx +++ b/client/src/app/components/TableControls/TableHeaderContentWithControls.tsx @@ -12,16 +12,18 @@ export const TableHeaderContentWithControls: React.FC< ITableHeaderContentWithControlsProps > = ({ numColumnsBeforeData, numColumnsAfterData, children }) => ( <> + {/* eslint-disable @eslint-react/no-array-index-key -- filler cells with no identity beyond position */} {Array(numColumnsBeforeData) .fill(null) .map((_, i) => ( - + ))} {children} {Array(numColumnsAfterData) .fill(null) .map((_, i) => ( - + ))} + {/* eslint-enable @eslint-react/no-array-index-key */} ); diff --git a/client/src/app/pages/sbom-scan/components/UploadFileForAnalysis.tsx b/client/src/app/pages/sbom-scan/components/UploadFileForAnalysis.tsx index 432987388..743e2e250 100644 --- a/client/src/app/pages/sbom-scan/components/UploadFileForAnalysis.tsx +++ b/client/src/app/pages/sbom-scan/components/UploadFileForAnalysis.tsx @@ -77,12 +77,12 @@ export const UploadFileForAnalysis: React.FC = ({ browseButtonText="Browse Files" /> ) : ( - Array.from(uploads.entries()).map((\1) => { + Array.from(uploads.entries()).map(([file, upload]) => { if (upload.error) { if (upload.wasCancelled) { return ( = ({ return ( = ({ return ( Date: Thu, 28 May 2026 17:12:00 +0200 Subject: [PATCH 3/4] fix: prettier formatting Co-Authored-By: Claude Opus 4.6 (1M context) --- client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx b/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx index b8115fdaa..f7e8ecf7f 100644 --- a/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx +++ b/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx @@ -390,9 +390,7 @@ export const VulnerabilitiesBySbom: React.FC = ({ ); } else { return ( - + {purl.parentName} From a709bb63d4eff0e29853067d71302bc140258699 Mon Sep 17 00:00:00 2001 From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com> Date: Wed, 1 Jul 2026 14:55:57 +0200 Subject: [PATCH 4/4] fix: remaining fixes --- .../csaf-vulnerabilities-tab/Remediations.tsx | 4 +- .../VulnerabilityCard.tsx | 6 +- .../advisory-details/helpers/csaf-utils.tsx | 1 + .../app/pages/package-list/package-table.tsx | 4 +- .../sbom-details/vulnerabilities-by-sbom.tsx | 94 +++++++++---------- 5 files changed, 55 insertions(+), 54 deletions(-) diff --git a/client/src/app/pages/advisory-details/components/csaf-vulnerabilities-tab/Remediations.tsx b/client/src/app/pages/advisory-details/components/csaf-vulnerabilities-tab/Remediations.tsx index c57c137b4..e5bf006d2 100644 --- a/client/src/app/pages/advisory-details/components/csaf-vulnerabilities-tab/Remediations.tsx +++ b/client/src/app/pages/advisory-details/components/csaf-vulnerabilities-tab/Remediations.tsx @@ -78,8 +78,8 @@ export const CsafRemediations: React.FC = ({ isIndented > - {sorted.map((rem, i) => ( - + {sorted.map((rem) => ( + = ({ )} {vulnerability.threats && vulnerability.threats.length > 0 && - vulnerability.threats.map((threat, i) => ( - + vulnerability.threats.map((threat) => ( + {capitalize(threat.category)} diff --git a/client/src/app/pages/advisory-details/helpers/csaf-utils.tsx b/client/src/app/pages/advisory-details/helpers/csaf-utils.tsx index 677a9675d..b9063a77a 100644 --- a/client/src/app/pages/advisory-details/helpers/csaf-utils.tsx +++ b/client/src/app/pages/advisory-details/helpers/csaf-utils.tsx @@ -188,6 +188,7 @@ export function linkifyDetails(text: string): React.ReactNode[] { const parts = text.split(URL_REGEX); return parts.map((part, i) => i % 2 === 1 ? ( + // eslint-disable-next-line @eslint-react/no-array-index-key -- index is the only identity for regex-split fragments {part} diff --git a/client/src/app/pages/package-list/package-table.tsx b/client/src/app/pages/package-list/package-table.tsx index 36baf89e6..4ac30c005 100644 --- a/client/src/app/pages/package-list/package-table.tsx +++ b/client/src/app/pages/package-list/package-table.tsx @@ -171,7 +171,9 @@ export const PackageTable: React.FC = () => { {isCellExpanded(item, "licenses") ? ( {pkg?.licenses?.map((license) => ( - + {license.license_name} ))} diff --git a/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx b/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx index f7e8ecf7f..4c103f419 100644 --- a/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx +++ b/client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx @@ -352,56 +352,52 @@ export const VulnerabilitiesBySbom: React.FC = ({ - {Array.from(item.purls.entries()).map( - ([purlKey, purl]) => { - if (!purl.isOrphan) { - const decomposedPurl = decomposePurl( - purl.purlSummary.purl, - ); - return ( - - {decomposedPurl?.type} - {decomposedPurl?.namespace} - - - {decomposedPurl?.name} - - - {decomposedPurl?.version} - {decomposedPurl?.path} - - {decomposedPurl?.qualifiers && ( - + {Array.from(item.purls.values()).map((purl) => { + if (!purl.isOrphan) { + const decomposedPurl = decomposePurl( + purl.purlSummary.purl, + ); + return ( + + {decomposedPurl?.type} + {decomposedPurl?.namespace} + + - - ); - } else { - return ( - - - - {purl.parentName} - - - - - ); - } - }, - )} + > + {decomposedPurl?.name} + + + {decomposedPurl?.version} + {decomposedPurl?.path} + + {decomposedPurl?.qualifiers && ( + + )} + + + ); + } else { + return ( + + + + {purl.parentName} + + + + + ); + } + })} ) : null}