Skip to content

Commit

Permalink
feat: Adding group-issues option for JSON output
Browse files Browse the repository at this point in the history
  • Loading branch information
mladkau committed Nov 27, 2020
1 parent 05ad7cc commit ea8f68d
Show file tree
Hide file tree
Showing 7 changed files with 1,706 additions and 2 deletions.
19 changes: 17 additions & 2 deletions src/cli/commands/test/formatters/format-test-results.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,22 @@ import { createSarifOutputForIac } from '../iac-output';
import { isNewVuln, isVulnFixable } from '../vuln-helpers';
import { jsonStringifyLargeObject } from '../../../../lib/json';

export function formatJsonOutput(jsonData) {
export function formatJsonOutput(jsonData, options: Options) {
const jsonDataClone = _.cloneDeep(jsonData);

if (options['group-issues']) {
jsonDataClone.vulnerabilities = Object.values(
(jsonDataClone.vulnerabilities || []).reduce((acc, vuln): Record<
string,
any
> => {
vuln.from = [vuln.from].concat(acc[vuln.id]?.from || []);
acc[vuln.id] = vuln;
return acc;
}, {}),
);
}

if (jsonDataClone.vulnerabilities) {
jsonDataClone.vulnerabilities.forEach((vuln) => {
if (vuln.reachability) {
Expand All @@ -57,7 +70,9 @@ export function extractDataToSendFromResults(

let stringifiedJsonData = '';
if (options.json || options['json-file-output']) {
stringifiedJsonData = jsonStringifyLargeObject(formatJsonOutput(jsonData));
stringifiedJsonData = jsonStringifyLargeObject(
formatJsonOutput(jsonData, options),
);
}

const dataToSend = options.sarif ? sarifData : jsonData;
Expand Down
10 changes: 10 additions & 0 deletions src/cli/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,16 @@ async function main() {
'—json only to get your image vulnerabilties, excluding the application ones.',
]);
}
if (args.options['group-issues'] && args.options['iac']) {
throw new UnsupportedOptionCombinationError([
'--group-issues is currently not supported for Snyk IaC.',
]);
}
if (args.options['group-issues'] && !args.options['json']) {
throw new UnsupportedOptionCombinationError([
'JSON output is required to use --group-issues, try adding --json.',
]);
}

if (
args.options.file &&
Expand Down
1 change: 1 addition & 0 deletions src/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ export interface Options {
'app-vulns'?: boolean;
debug?: boolean;
sarif?: boolean;
'group-issues'?: boolean;
}

// TODO(kyegupov): catch accessing ['undefined-properties'] via noImplicitAny
Expand Down

0 comments on commit ea8f68d

Please sign in to comment.