diff --git a/package.json b/package.json index 9ab85ff29a4..fc56b4f07bc 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "@types/agent-base": "^4.2.0", "abbrev": "^1.1.1", "ansi-escapes": "3.2.0", + "wrap-ansi": "6.0.0", "chalk": "^2.4.2", "configstore": "^3.1.2", "debug": "^3.1.0", diff --git a/src/cli/commands/test/formatters/legacy-format-issue.ts b/src/cli/commands/test/formatters/legacy-format-issue.ts index edf8044569a..c97f9d16d6d 100644 --- a/src/cli/commands/test/formatters/legacy-format-issue.ts +++ b/src/cli/commands/test/formatters/legacy-format-issue.ts @@ -1,5 +1,6 @@ import * as _ from 'lodash'; import chalk from 'chalk'; +import * as wrap from 'wrap-ansi'; import * as config from '../../../../lib/config'; import {Options, TestOptions} from '../../../../lib/types'; import {isLocalFolder} from '../../../../lib/detect'; @@ -42,7 +43,8 @@ export function formatIssues(vuln: GroupedVuln, options: Options & TestOptions) : '', fixedIn: options.docker ? createFixedInText(vuln) : '', dockerfilePackage: options.docker ? dockerfileInstructionText(vuln) : '', - legalInstructions: vuln.legalInstructions ? chalk.bold('\n Legal instructions: ' + vuln.legalInstructions) : '', + legalInstructions: vuln.legalInstructions ? chalk.bold('\n Legal instructions:\n ' + + wrap(vuln.legalInstructions, 100).split('\n').join('\n ')) : '', }; return ( diff --git a/src/cli/commands/test/formatters/remediation-based-format-issues.ts b/src/cli/commands/test/formatters/remediation-based-format-issues.ts index 5a8b92d8145..820068db69b 100644 --- a/src/cli/commands/test/formatters/remediation-based-format-issues.ts +++ b/src/cli/commands/test/formatters/remediation-based-format-issues.ts @@ -1,9 +1,16 @@ import * as _ from 'lodash'; import chalk from 'chalk'; +import * as wrap from 'wrap-ansi'; import * as config from '../../../../lib/config'; import { TestOptions } from '../../../../lib/types'; -import { RemediationResult, PatchRemediation, - DependencyUpdates, IssueData, SEVERITY, GroupedVuln } from '../../../../lib/snyk-test/legacy'; +import { + RemediationResult, + PatchRemediation, + DependencyUpdates, + IssueData, + SEVERITY, + GroupedVuln, +} from '../../../../lib/snyk-test/legacy'; interface BasicVulnInfo { title: string; @@ -19,7 +26,7 @@ export function formatIssuesWithRemediation( vulns: GroupedVuln[], remediationInfo: RemediationResult, options: TestOptions, - ): string[] { +): string[] { const basicVulnInfo: { [name: string]: BasicVulnInfo, @@ -65,7 +72,7 @@ function constructPatchesText( basicVulnInfo: { [name: string]: BasicVulnInfo; }, - ): string[] { +): string[] { if (!(Object.keys(patches).length > 0)) { return []; @@ -94,7 +101,7 @@ function constructUpgradesText( basicVulnInfo: { [name: string]: BasicVulnInfo; }, - ): string[] { +): string[] { if (!(Object.keys(upgrades).length > 0)) { return []; @@ -105,15 +112,15 @@ function constructUpgradesText( const upgradeDepTo = _.get(upgrades, [upgrade, 'upgradeTo']); const vulnIds = _.get(upgrades, [upgrade, 'vulns']); const upgradeText = - `\n Upgrade ${chalk.bold.whiteBright(upgrade)} to ${chalk.bold.whiteBright(upgradeDepTo)} to fix\n`; + `\n Upgrade ${chalk.bold.whiteBright(upgrade)} to ${chalk.bold.whiteBright(upgradeDepTo)} to fix\n`; const thisUpgradeFixes = vulnIds .map((id) => formatIssue( - id, - basicVulnInfo[id].title, - basicVulnInfo[id].severity, - basicVulnInfo[id].isNew, - `${basicVulnInfo[id].name}@${basicVulnInfo[id].version}`, - basicVulnInfo[id].legalInstructions)) + id, + basicVulnInfo[id].title, + basicVulnInfo[id].severity, + basicVulnInfo[id].isNew, + `${basicVulnInfo[id].name}@${basicVulnInfo[id].version}`, + basicVulnInfo[id].legalInstructions)) .join('\n'); upgradeTextArray.push(upgradeText + thisUpgradeFixes); } @@ -168,11 +175,13 @@ function formatIssue( }; const newBadge = isNew ? ' (new)' : ''; const name = vulnerableModule ? ` in ${chalk.bold(vulnerableModule)}` : ''; + const wrapLegalText = wrap(`${legalInstructions}`, 100); + const formatLegalText = wrapLegalText.split('\n').join('\n '); return severitiesColourMapping[severity].colorFunc( ` ✗ ${chalk.bold(title)}${newBadge} [${titleCaseText(severity)} Severity]`, - ) + `[${config.ROOT}/vuln/${id}]` + name - + (legalInstructions ? `${chalk.bold('\nLegal instructions')}: ${legalInstructions}` : '') ; + ) + `[${config.ROOT}/vuln/${id}]` + name + + (legalInstructions ? `${chalk.bold('\n Legal instructions')}:\n ${formatLegalText}` : ''); } function titleCaseText(text) {