{"version":3,"file":"findings-Bdwy-IjY.js","sources":["../../../../src/ts/findings/main.ts"],"sourcesContent":["import { FindingsTableItem } from \"../../models/tables\";\nimport { CommonFilterData } from \"../../models/filters\";\nimport { Table } from \"../utils\";\n\ntype CompareFunction = (a: FindingsTableItem, b: FindingsTableItem) => number;\n\nexport class FindingTable extends Table {\n private sortFunctions: Record = {};\n\n constructor(data: FindingsTableItem[]) {\n super(data);\n this.initSortFunctions();\n this.tableData = this.groupFindings();\n }\n\n private initSortFunctions(): void {\n const createCompareFunction = (getValueFn: (item: FindingsTableItem) => string | number | Date | string[]): CompareFunction => {\n return (a, b) => {\n const valueA = getValueFn(a);\n const valueB = getValueFn(b);\n\n // Special handling for arrays (stages/branches)\n if (Array.isArray(valueA) && Array.isArray(valueB)) {\n return this.compareArrays(valueA, valueB);\n }\n\n if (valueA === valueB) return 0;\n if (typeof valueA === 'string' && typeof valueB === 'string') {\n return valueA.localeCompare(valueB);\n }\n return valueA < valueB ? -1 : 1;\n };\n };\n\n this.sortFunctions = {\n name: createCompareFunction(item => item.name || ''),\n project: createCompareFunction(item => item.project?.name || ''),\n package: createCompareFunction(item => `${item.details.package_id} ${item.details.package_spec}`),\n location: createCompareFunction(item => item.details.location || ''),\n date_last_seen: createCompareFunction(item => new Date(item.date_last_seen)),\n status: createCompareFunction(item => item.status || ''),\n branches: (a, b) => this.compareBranches(a, b),\n stages: createCompareFunction(item => item.stages),\n exploitability_score: (a, b) =>\n (b.exploitability_score ?? -Infinity) - (a.exploitability_score ?? -Infinity), // Descending order\n cvss_score: (a, b) =>\n (b.cvss_score ?? -Infinity) - (a.cvss_score ?? -Infinity),\n default: createCompareFunction(item => String(item[this.sortCol as keyof FindingsTableItem]))\n };\n }\n\n private compareArrays(a: string[], b: string[]): number {\n for (let i = 0; i < Math.min(a.length, b.length); i++) {\n const comparison = a[i].localeCompare(b[i]);\n if (comparison !== 0) return comparison;\n }\n return a.length - b.length;\n }\n\n private compareBranches(a: FindingsTableItem, b: FindingsTableItem): number {\n const aHasDefault = a.project ? a.branches.includes(a.project.default_branch) : false;\n const bHasDefault = b.project ? b.branches.includes(b.project.default_branch) : false;\n\n if (aHasDefault && !bHasDefault) return -1;\n if (!aHasDefault && bHasDefault) return 1;\n\n const aSortedBranches = this.sortBranches(a.branches, a.project?.default_branch || '');\n const bSortedBranches = this.sortBranches(b.branches, b.project?.default_branch || '');\n\n return this.compareArrays(aSortedBranches, bSortedBranches);\n }\n\n private sortBranches(branches: string[], defaultBranch: string): string[] {\n return branches.sort((a, b) => {\n if (a === defaultBranch) return -1;\n if (b === defaultBranch) return 1;\n return a.localeCompare(b);\n });\n }\n\n groupFindings(): FindingsTableItem[] {\n const groupedMap = new Map();\n this.constantTableData.forEach((finding: FindingsTableItem) => {\n const existingFinding = groupedMap.get(finding.unique_identifier);\n if (!existingFinding || finding.date_last_seen > existingFinding.date_last_seen) {\n groupedMap.set(finding.unique_identifier, finding);\n }\n });\n return Array.from(groupedMap.values());\n }\n\n sort(col: string): void {\n this.sortAsc = this.sortCol === col ? !this.sortAsc : false;\n this.sortCol = col;\n\n const compareFunction = this.sortFunctions[col] || this.sortFunctions.default;\n this.tableData.sort((a: FindingsTableItem, b: FindingsTableItem) => {\n const result = compareFunction(a, b);\n return this.sortAsc ? -result : result;\n });\n }\n\n filterTable(filterData: CommonFilterData[]): void {\n const activeFilters = filterData.filter(filter => filter.options.some(option => option.checked));\n\n if (activeFilters.length === 0) {\n this.tableData = this.groupFindings();\n } else {\n const filteredData: FindingsTableItem[] = this.constantTableData.filter((item: FindingsTableItem) =>\n activeFilters.every((filter: CommonFilterData) => this.applyFilter(filter, item))\n );\n this.tableData = this.groupFindingsArray(filteredData);\n }\n\n this.curPage = this.tableData.length < this.pageSize ? 1 : this.curPage;\n }\n\n private applyFilter(filter: CommonFilterData, item: FindingsTableItem): boolean {\n const validOptions = filter.options.filter(option => option.checked);\n return validOptions.some(option => {\n let comparisonValue: string | undefined;\n\n switch (filter.col) {\n case 'project':\n comparisonValue = item.project?.name;\n break;\n case 'package':\n comparisonValue = `${item.details?.package_id ?? \"\"} ${item.details?.package_spec ?? \"\"}`;\n break;\n case 'branch_name':\n comparisonValue = item.branch_name;\n break;\n case 'location':\n comparisonValue = item.details?.location;\n break;\n default:\n comparisonValue = item[filter.col as keyof FindingsTableItem] as string | undefined;\n }\n\n return option.value === comparisonValue;\n });\n }\n\n private groupFindingsArray(findings: FindingsTableItem[]): FindingsTableItem[] {\n const groupedMap = new Map();\n findings.forEach(finding => {\n const existingFinding = groupedMap.get(finding.unique_identifier);\n if (!existingFinding || finding.date_last_seen > existingFinding.date_last_seen) {\n groupedMap.set(finding.unique_identifier, finding);\n }\n });\n return Array.from(groupedMap.values());\n }\n}\n\nexport const elevated = (data: FindingsTableItem[]): FindingsTableItem[] =>\n data.filter(row => row.risk_score?.label === \"critical\");\n\nexport const fixVulnerabilityTab = () => ({\n tabItems: [\n { label: \"Pip\", isActive: true },\n { label: \"Poetry\", isActive: false },\n { label: \"Pipenv\", isActive: false },\n ],\n switchTabs(tabItem: string) {\n this.tabItems = this.tabItems.map(item => ({\n ...item,\n isActive: item.label === tabItem\n }));\n },\n});\n"],"names":["FindingTable","Table","data","createCompareFunction","getValueFn","a","b","valueA","valueB","item","i","comparison","aHasDefault","bHasDefault","aSortedBranches","bSortedBranches","branches","defaultBranch","groupedMap","finding","existingFinding","col","compareFunction","result","filterData","activeFilters","filter","option","filteredData","comparisonValue","findings","fixVulnerabilityTab","tabItem"],"mappings":"iXAMO,MAAMA,UAAqBC,CAAM,CAC9B,cAAiD,CAAC,EAE1D,YAAYC,EAA2B,CACrC,MAAMA,CAAI,EACV,KAAK,kBAAkB,EAClB,KAAA,UAAY,KAAK,cAAc,CAAA,CAG9B,mBAA0B,CAC1B,MAAAC,EAAyBC,GACtB,CAACC,EAAGC,IAAM,CACT,MAAAC,EAASH,EAAWC,CAAC,EACrBG,EAASJ,EAAWE,CAAC,EAG3B,OAAI,MAAM,QAAQC,CAAM,GAAK,MAAM,QAAQC,CAAM,EACxC,KAAK,cAAcD,EAAQC,CAAM,EAGtCD,IAAWC,EAAe,EAC1B,OAAOD,GAAW,UAAY,OAAOC,GAAW,SAC3CD,EAAO,cAAcC,CAAM,EAE7BD,EAASC,EAAS,GAAK,CAChC,EAGF,KAAK,cAAgB,CACnB,KAAML,EAA8BM,GAAAA,EAAK,MAAQ,EAAE,EACnD,QAASN,EAAsBM,GAAQA,EAAK,SAAS,MAAQ,EAAE,EAC/D,QAASN,EAAsBM,GAAQ,GAAGA,EAAK,QAAQ,UAAU,IAAIA,EAAK,QAAQ,YAAY,EAAE,EAChG,SAAUN,EAAsBM,GAAQA,EAAK,QAAQ,UAAY,EAAE,EACnE,eAAgBN,EAAsBM,GAAQ,IAAI,KAAKA,EAAK,cAAc,CAAC,EAC3E,OAAQN,EAA8BM,GAAAA,EAAK,QAAU,EAAE,EACvD,SAAU,CAACJ,EAAGC,IAAM,KAAK,gBAAgBD,EAAGC,CAAC,EAC7C,OAAQH,EAA8BM,GAAAA,EAAK,MAAM,EACjD,qBAAsB,CAACJ,EAAGC,KACvBA,EAAE,sBAAwB,OAAcD,EAAE,sBAAwB,MACrE,WAAY,CAACA,EAAGC,KACbA,EAAE,YAAc,OAAcD,EAAE,YAAc,MACjD,QAASF,EAA8BM,GAAA,OAAOA,EAAK,KAAK,OAAkC,CAAC,CAAC,CAC9F,CAAA,CAGM,cAAcJ,EAAaC,EAAqB,CAC7C,QAAAI,EAAI,EAAGA,EAAI,KAAK,IAAIL,EAAE,OAAQC,EAAE,MAAM,EAAGI,IAAK,CACrD,MAAMC,EAAaN,EAAEK,CAAC,EAAE,cAAcJ,EAAEI,CAAC,CAAC,EACtC,GAAAC,IAAe,EAAU,OAAAA,CAAA,CAExB,OAAAN,EAAE,OAASC,EAAE,MAAA,CAGd,gBAAgBD,EAAsBC,EAA8B,CACpE,MAAAM,EAAcP,EAAE,QAAUA,EAAE,SAAS,SAASA,EAAE,QAAQ,cAAc,EAAI,GAC1EQ,EAAcP,EAAE,QAAUA,EAAE,SAAS,SAASA,EAAE,QAAQ,cAAc,EAAI,GAE5E,GAAAM,GAAe,CAACC,EAAoB,MAAA,GACpC,GAAA,CAACD,GAAeC,EAAoB,MAAA,GAElC,MAAAC,EAAkB,KAAK,aAAaT,EAAE,SAAUA,EAAE,SAAS,gBAAkB,EAAE,EAC/EU,EAAkB,KAAK,aAAaT,EAAE,SAAUA,EAAE,SAAS,gBAAkB,EAAE,EAE9E,OAAA,KAAK,cAAcQ,EAAiBC,CAAe,CAAA,CAGpD,aAAaC,EAAoBC,EAAiC,CACxE,OAAOD,EAAS,KAAK,CAACX,EAAGC,IACnBD,IAAMY,EAAsB,GAC5BX,IAAMW,EAAsB,EACzBZ,EAAE,cAAcC,CAAC,CACzB,CAAA,CAGH,eAAqC,CAC7B,MAAAY,MAAiB,IAClB,YAAA,kBAAkB,QAASC,GAA+B,CAC7D,MAAMC,EAAkBF,EAAW,IAAIC,EAAQ,iBAAiB,GAC5D,CAACC,GAAmBD,EAAQ,eAAiBC,EAAgB,iBACpDF,EAAA,IAAIC,EAAQ,kBAAmBA,CAAO,CACnD,CACD,EACM,MAAM,KAAKD,EAAW,OAAA,CAAQ,CAAA,CAGvC,KAAKG,EAAmB,CACtB,KAAK,QAAU,KAAK,UAAYA,EAAM,CAAC,KAAK,QAAU,GACtD,KAAK,QAAUA,EAEf,MAAMC,EAAkB,KAAK,cAAcD,CAAG,GAAK,KAAK,cAAc,QACtE,KAAK,UAAU,KAAK,CAAChB,EAAsBC,IAAyB,CAC5D,MAAAiB,EAASD,EAAgBjB,EAAGC,CAAC,EAC5B,OAAA,KAAK,QAAU,CAACiB,EAASA,CAAA,CACjC,CAAA,CAGH,YAAYC,EAAsC,CAC1C,MAAAC,EAAgBD,EAAW,OAAiBE,GAAAA,EAAO,QAAQ,KAAKC,GAAUA,EAAO,OAAO,CAAC,EAE3F,GAAAF,EAAc,SAAW,EACtB,KAAA,UAAY,KAAK,cAAc,MAC/B,CACC,MAAAG,EAAoC,KAAK,kBAAkB,OAAQnB,GACvEgB,EAAc,MAAOC,GAA6B,KAAK,YAAYA,EAAQjB,CAAI,CAAC,CAClF,EACK,KAAA,UAAY,KAAK,mBAAmBmB,CAAY,CAAA,CAGvD,KAAK,QAAU,KAAK,UAAU,OAAS,KAAK,SAAW,EAAI,KAAK,OAAA,CAG1D,YAAYF,EAA0BjB,EAAkC,CAEvE,OADciB,EAAO,QAAQ,OAAOC,GAAUA,EAAO,OAAO,EAC/C,KAAeA,GAAA,CAC7B,IAAAE,EAEJ,OAAQH,EAAO,IAAK,CAClB,IAAK,UACHG,EAAkBpB,EAAK,SAAS,KAChC,MACF,IAAK,UACeoB,EAAA,GAAGpB,EAAK,SAAS,YAAc,EAAE,IAAIA,EAAK,SAAS,cAAgB,EAAE,GACvF,MACF,IAAK,cACHoB,EAAkBpB,EAAK,YACvB,MACF,IAAK,WACHoB,EAAkBpB,EAAK,SAAS,SAChC,MACF,QACoBoB,EAAApB,EAAKiB,EAAO,GAA8B,CAAA,CAGhE,OAAOC,EAAO,QAAUE,CAAA,CACzB,CAAA,CAGK,mBAAmBC,EAAoD,CACvE,MAAAZ,MAAiB,IACvB,OAAAY,EAAS,QAAmBX,GAAA,CAC1B,MAAMC,EAAkBF,EAAW,IAAIC,EAAQ,iBAAiB,GAC5D,CAACC,GAAmBD,EAAQ,eAAiBC,EAAgB,iBACpDF,EAAA,IAAIC,EAAQ,kBAAmBA,CAAO,CACnD,CACD,EACM,MAAM,KAAKD,EAAW,OAAA,CAAQ,CAAA,CAEzC,CAKO,MAAMa,EAAsB,KAAO,CACxC,SAAU,CACR,CAAE,MAAO,MAAO,SAAU,EAAK,EAC/B,CAAE,MAAO,SAAU,SAAU,EAAM,EACnC,CAAE,MAAO,SAAU,SAAU,EAAM,CACrC,EACA,WAAWC,EAAiB,CAC1B,KAAK,SAAW,KAAK,SAAS,IAAavB,IAAA,CACzC,GAAGA,EACH,SAAUA,EAAK,QAAUuB,CAAA,EACzB,CAAA,CAEN"}