diff --git a/src/lib/snyk-to-html.ts b/src/lib/snyk-to-html.ts index b1f3a3b..c691e08 100755 --- a/src/lib/snyk-to-html.ts +++ b/src/lib/snyk-to-html.ts @@ -6,7 +6,7 @@ import marked = require('marked'); import moment = require('moment'); import path = require('path'); -const severityMap = {low: 0, medium: 1, high: 2}; +const severityMap = { low: 0, medium: 1, high: 2 }; function readFile(filePath: string, encoding: string): Promise { return new Promise((resolve, reject) => { @@ -51,17 +51,27 @@ function metadataForVuln(vuln: any) { function groupVulns(vulns) { const result = {}; - if (!vulns || typeof vulns.length === 'undefined') { - return result; + let uniqueCount = 0; + let pathsCount = 0; + + if (vulns && Array.isArray(vulns)) { + vulns.map(vuln => { + if (!result[vuln.id]) { + result[vuln.id] = { list: [vuln], metadata: metadataForVuln(vuln) }; + pathsCount++; + uniqueCount++; + } else { + result[vuln.id].list.push(vuln); + pathsCount++; + } + }); } - vulns.map( vuln => { - if (!result[vuln.id]) { - result[vuln.id] = {list: [vuln], metadata: metadataForVuln(vuln)}; - } else { - result[vuln.id].list.push(vuln); - } - }); - return result; + + return { + vulnerabilities: result, + vulnerabilitiesUniqueCount: uniqueCount, + vulnerabilitiesPathsCount: pathsCount, + }; } async function compileTemplate(fileName: string): Promise { @@ -76,7 +86,10 @@ async function registerPeerPartial(templatePath: string, name: string): Promise< } async function generateTemplate(data: any, template: string): Promise { - data.vulnerabilities = groupVulns(data.vulnerabilities); + const vulnMetadata = groupVulns(data.vulnerabilities); + data.vulnerabilities = vulnMetadata.vulnerabilities; + data.uniqueCount = vulnMetadata.vulnerabilitiesUniqueCount; + data.summary = vulnMetadata.vulnerabilitiesPathsCount + ' vulnerable dependency paths'; await registerPeerPartial(template, 'inline-css'); await registerPeerPartial(template, 'vuln-card'); @@ -90,11 +103,11 @@ function mergeData(dataArray: any[]): any { const aggregateVulnerabilities = [].concat(...vulnsArrays); const totalUniqueCount = - dataArray.reduce((acc, item) => acc + item.uniqueCount || 0, 0); + dataArray.reduce((acc, item) => acc + item.vulnerabilities.length || 0, 0); const totalDepCount = dataArray.reduce((acc, item) => acc + item.dependencyCount || 0, 0); - const paths = dataArray.map(project => ({path: project.path, packageManager: project.packageManager})); + const paths = dataArray.map(project => ({ path: project.path, packageManager: project.packageManager })); return { vulnerabilities: aggregateVulnerabilities, diff --git a/template/test-report.hbs b/template/test-report.hbs index 1ba0f70..5ca0313 100644 --- a/template/test-report.hbs +++ b/template/test-report.hbs @@ -8,53 +8,57 @@ Snyk test report - + {{> inline-css }} -
+
-
-
-
-

Snyk test report

-

{{moment d "MMMM Do YYYY, h:mm:ss a"}}

- {{#if paths}} +
+
+
+

Snyk test report

+

{{moment d "MMMM Do YYYY, h:mm:ss a"}}

+ {{#if paths}}
Scanned the following paths:
    {{#each paths}}
  • {{path}} ({{packageManager}})
  • {{/each}}
- {{/if}} - {{#if path}} + {{/if}} + {{#if path}}
Scanned the following path: -
  • {{path}} ({{packageManager}})
+
    +
  • {{path}} ({{packageManager}})
  • +
- {{/if}} + {{/if}} -
-
{{uniqueCount}} known vulnerabilities
-
{{summary}}
-
{{dependencyCount}} dependencies
-
-
-
-
+
+
{{uniqueCount}} known vulnerabilities
+
{{summary}}
+
{{dependencyCount}} dependencies
+
+
+
+
-
-
-
- {{#each vulnerabilities}} - {{> vuln-card }} - {{/each}} -
-
-
+
+
+
+ {{#each vulnerabilities}} + {{> vuln-card }} + {{/each}} +
+
+
-
+
- + + \ No newline at end of file