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}} + + + - + -
{{moment d "MMMM Do YYYY, h:mm:ss a"}}