| skipped 4 lines |
5 | 5 | | import { RootState } from '../'; |
6 | 6 | | import { FiltersState } from '../../components/layouts/Filters/Filters'; |
7 | 7 | | import { SeverityWeightMap } from '../../components/ui/Vulnerability/Vulnerability'; |
8 | | - | import type { Api } from '../../services/apiClient'; |
| 8 | + | import type { ClientApi } from '../../services/apiClient'; |
9 | 9 | | |
10 | 10 | | const getFlags = (state: RootState) => ({ |
11 | 11 | | isLoading: state.webpageResults.isLoading, |
12 | 12 | | isFailed: state.webpageResults.isFailed, |
13 | 13 | | }); |
14 | | - | const getPackages = (state: RootState) => state.webpageResults.detectionResult.packages; |
15 | | - | const getWebpages = (state: RootState) => state.webpageResults.detectionResult.webpages; |
| 14 | + | const getScanStatus = (state: RootState) => state.webpageResults.detectionResult?.status; |
| 15 | + | const getPackages = (state: RootState) => |
| 16 | + | state.webpageResults.detectionResult?.scanResult?.packages; |
16 | 17 | | const getVulnerabilities = (state: RootState) => |
17 | | - | state.webpageResults.detectionResult.vulnerabilities; |
| 18 | + | state.webpageResults.detectionResult?.scanResult?.vulnerabilities; |
18 | 19 | | const getSorting = (state: RootState) => state.webpageResults.filters.sort; |
19 | 20 | | const getFilter = (state: RootState) => state.webpageResults.filters.filter; |
20 | 21 | | const getPackageNameFilter = (state: RootState) => state.webpageResults.filters.filterPackageName; |
21 | 22 | | |
22 | | - | const compareByPopularity = (left: Api.WebPagePackage, right: Api.WebPagePackage) => |
| 23 | + | const compareByPopularity = ( |
| 24 | + | left: ClientApi.ScanResultPackageResponse, |
| 25 | + | right: ClientApi.ScanResultPackageResponse |
| 26 | + | ) => |
23 | 27 | | (right.registryMetadata?.monthlyDownloads ?? 0) - (left.registryMetadata?.monthlyDownloads ?? 0); |
24 | 28 | | |
25 | 29 | | const pickHighestSeverity = memoize( |
26 | | - | (packageName: string, vulnerabilities: Record<string, Api.Vulnerability[]>) => |
| 30 | + | ( |
| 31 | + | packageName: string, |
| 32 | + | vulnerabilities: Record<string, ClientApi.PackageVulnerabilityResponse[]> |
| 33 | + | ) => |
27 | 34 | | (vulnerabilities[packageName] ?? []) |
28 | 35 | | .map((it) => it.severity) |
29 | 36 | | .filter((it): it is GithubAdvisorySeverity => !!it) |
| skipped 6 lines |
36 | 43 | | const sortingModes: Record< |
37 | 44 | | FiltersState['sort'], |
38 | 45 | | ( |
39 | | - | packages: Api.WebPagePackage[], |
40 | | - | vulnerabilities: Record<string, Api.Vulnerability[]> |
41 | | - | ) => Api.WebPagePackage[] |
| 46 | + | packages: ClientApi.ScanResultPackageResponse[], |
| 47 | + | vulnerabilities: Record<string, ClientApi.PackageVulnerabilityResponse[]> |
| 48 | + | ) => ClientApi.ScanResultPackageResponse[] |
42 | 49 | | > = { |
43 | 50 | | // TODO |
44 | 51 | | confidenceScore: (packages) => packages, |
| skipped 1 lines |
46 | 53 | | importDepth: (packages) => packages, |
47 | 54 | | severity: (packages, vulnerabilities) => |
48 | 55 | | [...packages].sort((left, right) => { |
49 | | - | const leftSeverity = pickHighestSeverity(left.packageName, vulnerabilities); |
50 | | - | const rightSeverity = pickHighestSeverity(right.packageName, vulnerabilities); |
| 56 | + | const leftSeverity = pickHighestSeverity(left.name, vulnerabilities); |
| 57 | + | const rightSeverity = pickHighestSeverity(right.name, vulnerabilities); |
51 | 58 | | |
52 | 59 | | if (leftSeverity !== rightSeverity) { |
53 | 60 | | return SeverityWeightMap[rightSeverity] - SeverityWeightMap[leftSeverity]; |
| skipped 3 lines |
57 | 64 | | }), |
58 | 65 | | size: (packages) => |
59 | 66 | | [...packages].sort( |
60 | | - | (left, right) => |
61 | | - | (right.packageMetadata?.approximateByteSize ?? 0) - |
62 | | - | (left.packageMetadata?.approximateByteSize ?? 0) |
| 67 | + | (left, right) => (right.approximateByteSize ?? 0) - (left.approximateByteSize ?? 0) |
63 | 68 | | ), |
64 | | - | name: (packages) => |
65 | | - | [...packages].sort((left, right) => left.packageName.localeCompare(right.packageName)), |
| 69 | + | name: (packages) => [...packages].sort((left, right) => left.name.localeCompare(right.name)), |
66 | 70 | | packagePopularity: (packages) => [...packages].sort(compareByPopularity), |
67 | 71 | | }; |
68 | 72 | | |
69 | 73 | | const filterModes: Record< |
70 | 74 | | FiltersState['filter'], |
71 | 75 | | ( |
72 | | - | packages: Api.WebPagePackage[], |
73 | | - | vulnerabilities: Record<string, Api.Vulnerability[]>, |
| 76 | + | packages: ClientApi.ScanResultPackageResponse[], |
| 77 | + | vulnerabilities: Record<string, ClientApi.PackageVulnerabilityResponse[]>, |
74 | 78 | | packageName?: string |
75 | | - | ) => Api.WebPagePackage[] |
| 79 | + | ) => ClientApi.ScanResultPackageResponse[] |
76 | 80 | | > = { |
77 | 81 | | name: (packages, vulnerabilities, packageName) => { |
78 | 82 | | if (!packageName) { |
79 | 83 | | return packages; |
80 | 84 | | } |
81 | | - | return packages.filter((pkg) => pkg.packageName.includes(packageName)); |
| 85 | + | return packages.filter((pkg) => pkg.name.includes(packageName)); |
82 | 86 | | }, |
83 | 87 | | outdated: (packages) => |
84 | 88 | | packages.filter( |
85 | 89 | | (pkg) => |
86 | | - | pkg.registryMetadata && |
87 | | - | semver.gtr(pkg.registryMetadata.latestVersion, pkg.packageVersionRange) |
| 90 | + | pkg.registryMetadata && semver.gtr(pkg.registryMetadata.latestVersion, pkg.versionRange) |
88 | 91 | | ), |
89 | | - | vulnerable: (packages, vulnerabilities) => |
90 | | - | packages.filter((pkg) => !!vulnerabilities[pkg.packageName]), |
| 92 | + | vulnerable: (packages, vulnerabilities) => packages.filter((pkg) => !!vulnerabilities[pkg.name]), |
91 | 93 | | all: (packages) => packages, |
92 | 94 | | }; |
93 | 95 | | |
94 | 96 | | export const selectors = { |
95 | | - | default: createSelector([getWebpages, getVulnerabilities], (webpages, vulnerabilities) => ({ |
96 | | - | webpages, |
| 97 | + | default: createSelector([getScanStatus, getVulnerabilities], (scanStatus, vulnerabilities) => ({ |
| 98 | + | status: scanStatus, |
97 | 99 | | vulnerabilities, |
98 | 100 | | })), |
99 | | - | stateFlags: createSelector([getWebpages, getPackages, getFlags], (webpages, packages, flags) => ({ |
100 | | - | ...flags, |
101 | | - | isInvalid: |
102 | | - | packages.length === 0 && |
103 | | - | webpages.length > 0 && |
104 | | - | webpages.some((item) => item.status === 'pending'), |
105 | | - | isPending: webpages.length === 0 || webpages.some((item) => item.status === 'pending'), |
106 | | - | isProtected: webpages.some((item) => item.status === 'protected'), |
107 | | - | })), |
108 | | - | packagesStats: createSelector([getPackages, getVulnerabilities], (packages, vulnerabilities) => ({ |
| 101 | + | stateFlags: createSelector( |
| 102 | + | [getScanStatus, getPackages, getFlags], |
| 103 | + | (scanStatus, packages, flags) => ({ |
| 104 | + | ...flags, |
| 105 | + | isInvalid: packages && packages.length === 0, |
| 106 | + | isPending: !scanStatus || scanStatus === 'pending', |
| 107 | + | isProtected: scanStatus === 'protected', |
| 108 | + | }) |
| 109 | + | ), |
| 110 | + | packagesStats: createSelector([getPackages, getVulnerabilities], (packages = [], vulnerabilities = {}) => ({ |
109 | 111 | | total: packages.length, |
110 | | - | vulnerable: packages.filter((pkg) => (vulnerabilities[pkg.packageName]?.length ?? 0) > 0) |
| 112 | + | vulnerable: packages.filter((pkg) => (vulnerabilities[pkg.name]?.length ?? 0) > 0) |
111 | 113 | | .length, |
112 | 114 | | outdated: packages.filter( |
113 | 115 | | (pkg) => |
114 | 116 | | pkg.registryMetadata && |
115 | | - | semver.gtr(pkg.registryMetadata.latestVersion, pkg.packageVersionRange) |
| 117 | + | semver.gtr(pkg.registryMetadata.latestVersion, pkg.versionRange) |
116 | 118 | | ).length, |
117 | 119 | | })), |
118 | 120 | | packagesSortedAndFiltered: createSelector( |
119 | 121 | | [getPackages, getVulnerabilities, getSorting, getFilter, getPackageNameFilter], |
120 | 122 | | (packages, vulnerabilities, sorting, filter, packageNameFilter) => |
| 123 | + | packages && |
| 124 | + | vulnerabilities && |
121 | 125 | | filterModes[filter]( |
122 | 126 | | sortingModes[sorting](packages, vulnerabilities), |
123 | 127 | | vulnerabilities, |
| skipped 5 lines |