Skip to content

Commit e7d172b

Browse files
author
sparshithNR
committed
Allow CSV export option
1 parent 7743d51 commit e7d172b

8 files changed

Lines changed: 175 additions & 65 deletions

File tree

bin/supported

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#!/usr/bin/env node
22
'use strict';
33
const ora = require('ora');
4+
const { writeFileSync } = require('fs');
45
const { displayResult } = require('../lib/output/cli-output');
6+
const { writeToCsv } = require('../lib/output/csv-output');
57

68
(async function main(cli) {
79
if (cli.input.length === 0) {
@@ -31,6 +33,11 @@ const { displayResult } = require('../lib/output/cli-output');
3133
2,
3234
),
3335
);
36+
} else if(cli.flags.csv && result) {
37+
let fileName = `${result.projectName}-support-audit.csv`;
38+
let filePath = `${projectPath}/${fileName}`;
39+
writeFileSync(filePath, writeToCsv(result), 'utf-8' );
40+
console.log(`Report created at ${filePath}`);
3441
} else {
3542
displayResult(result, cli.flags);
3643
}

lib/help.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ module.exports = chalk`
99
{bold Usage}
1010
{gray $} {cyan supported <input-file>}
1111
{bold Options}
12-
{cyan --help, -h} this output
13-
{cyan --json, -j} output as json
14-
{cyan --verbose, -v} outputs detailed report of support audit
12+
{cyan --help, -h} this output
13+
{cyan --json, -j} output as json
14+
{cyan --verbose, -v} outputs detailed report of support audit
15+
{cyan --csv} outputs csv file in the project path
1516
{bold Examples}
1617
{gray $} {cyan supported ./path/to/project/}
1718
`;

lib/output/cli-output.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,18 +225,28 @@ function getViolationsDetail(supportChecks) {
225225
};
226226
}
227227

228-
function displayResult(supportResult, flags, message) {
229-
const title = supportResult.projectName;
228+
function generateMessages(supportResult) {
230229
const isInSupportWindow = supportResult.isInSupportWindow;
231-
const currentPolicy = message ? message : DEFAULT_SUPPORT_MESSAGE();
232230
let voilationDetails = getViolationsDetail(supportResult.supportChecks);
233231
let { violationCount, policyCount } = getPolicyViolationData(voilationDetails.violations);
232+
return {
233+
violationMessages: !isInSupportWindow ? getViolations(voilationDetails) : '',
234+
violationCount,
235+
policyCount
236+
}
237+
}
238+
239+
function displayResult(supportResult, flags, policyDetails) {
240+
const title = supportResult.projectName;
241+
const isInSupportWindow = supportResult.isInSupportWindow;
242+
const currentPolicy = policyDetails ? policyDetails : DEFAULT_SUPPORT_MESSAGE();
234243
let body = getBodyContent(supportResult.supportChecks);
244+
let { violationMessages, violationCount, policyCount } = generateMessages(supportResult);
235245
console.log(
236246
makeConsoleReport({
237247
title,
238248
isInSupportWindow,
239-
violationMessages: !isInSupportWindow ? getViolations(voilationDetails) : '',
249+
violationMessages,
240250
violationCount,
241251
policyCount,
242252
body: flags.verbose ? body : '',
@@ -250,4 +260,5 @@ module.exports = {
250260
getBodyContent,
251261
generateViolationMessage,
252262
getViolations,
263+
generateMessages,
253264
};

lib/output/csv-output.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
'use strict';
2+
3+
const { Parser } = require('json2csv');
4+
const stripAnsi = require('strip-ansi');
5+
const { generateMessages, generateViolationMessage } = require('./cli-output');
6+
const { LOG_TITLE, DEFAULT_SUPPORT_MESSAGE } = require('./messages');
7+
const MILLSINQUARTER = 91 * 24 * 60 * 60 * 1000;
8+
9+
module.exports = {
10+
writeToCsv
11+
}
12+
function writeToCsv(result, policyDetails) {
13+
const fields = [{
14+
label: 'Name',
15+
value: 'name'
16+
},{
17+
label: 'Supported',
18+
value: 'isSupported'
19+
}, {
20+
label: 'Violation Type',
21+
value: 'type',
22+
default: 'up-to-date'
23+
}, {
24+
label: 'How old?',
25+
value: (row) => row['duration'] ? `${Math.ceil(row['duration']/MILLSINQUARTER)}qtrs` : '-',
26+
}, {
27+
label: 'Resolved Version',
28+
value: 'resolvedVersion'
29+
}, {
30+
label: 'Latest Version',
31+
value: 'latestVersion'
32+
}
33+
];
34+
35+
const json2csvParser = new Parser({ fields });
36+
const csv = json2csvParser.parse(result.supportChecks);
37+
const { violationMessages } = generateMessages(result);
38+
const title = LOG_TITLE(result.isInSupportWindow);
39+
const fileContent = `${stripAnsi(title)}
40+
${!result.isInSupportWindow ? stripAnsi(generateViolationMessage(violationMessages)) : ''}
41+
${policyDetails ? stripAnsi(policyDetails) : stripAnsi(DEFAULT_SUPPORT_MESSAGE())}
42+
43+
${csv}
44+
`
45+
return fileContent;
46+
}

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@
3939
},
4040
"dependencies": {
4141
"@yarnpkg/lockfile": "^1.1.0",
42-
"boxen": "^5.0.0",
4342
"camelcase-keys": "^6.2.2",
4443
"chalk": "^4.1.0",
4544
"cli-table": "^0.3.4",
4645
"debug": "^4.3.1",
4746
"execa": "^5.0.0",
4847
"ini": "^1.3.7",
48+
"json2csv": "^5.0.6",
4949
"meow": "^8.0.0",
5050
"minipass-fetch": "^1.3.2",
5151
"moment": "^2.29.1",
@@ -57,9 +57,9 @@
5757
"parse-package-name": "^0.1.0",
5858
"promise.allsettled": "^1.0.4",
5959
"semver": "^7.3.4",
60+
"strip-ansi": "^6.0.0",
6061
"term-size": "^2.2.1",
61-
"terminal-link": "^2.1.1",
62-
"wordwrap": "^1.0.0"
62+
"terminal-link": "^2.1.1"
6363
},
6464
"files": [
6565
"lib",

tests/cli-test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const { expect } = require('chai');
44
const execa = require('execa');
5+
const fs = require('fs');
56
const { getBinPath } = require('get-bin-path');
67
const registries = require('./registries');
78

@@ -87,6 +88,27 @@ describe('CLI', function () {
8788
});
8889
});
8990

91+
describe('--csv', function () {
92+
afterEach(() => {
93+
let filePath = `${__dirname}/fixtures/unsupported-project/example-support-audit.csv`;
94+
if (fs.existsSync(filePath))
95+
fs.unlinkSync(filePath);
96+
});
97+
it('works against a unsupported project', async function () {
98+
const child = await execa(
99+
await getBinPath(),
100+
[`${__dirname}/fixtures/unsupported-project`, '--csv'],
101+
{
102+
shell: true,
103+
reject: false,
104+
},
105+
);
106+
expect(child.exitCode).to.eql(1);
107+
expect(child.stderr).to.eql('- working');
108+
expect(child.stdout).to.includes(`Report created at ${__dirname}/fixtures/unsupported-project`);
109+
});
110+
});
111+
90112
describe('--json', function () {
91113
it('works against a fully supported project', async function () {
92114
const child = await execa(

tests/csv-output-test.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
'use strict';
2+
3+
const { expect } = require('chai');
4+
const { writeToCsv } = require('../lib/output/csv-output');
5+
6+
describe('csv', function () {
7+
it('supported project', () => {
8+
let supportResult = {
9+
projectName: 'example',
10+
isInSupportWindow: true,
11+
supportChecks: [
12+
{
13+
isSupported: true,
14+
latestVersion: '4.8.5',
15+
name: 'rsvp',
16+
resolvedVersion: '4.8.5',
17+
},
18+
{
19+
isSupported: true,
20+
name: 'node',
21+
resolvedVersion: '15.3.0',
22+
latestVersion: '>=14.*',
23+
message: '',
24+
}
25+
],
26+
}
27+
let result = writeToCsv(supportResult);
28+
expect(result).to.includes(` ✓ Congrats!
29+
Your project is using only supported versions of libraries. No action is required.`);
30+
});
31+
it('unsupported project', () => {
32+
let supportResult = {
33+
projectName: 'example',
34+
isInSupportWindow: false,
35+
supportChecks: [
36+
{
37+
isSupported: false,
38+
latestVersion: '4.8.5',
39+
name: 'rsvp',
40+
resolvedVersion: '4.5.5',
41+
},
42+
{
43+
isSupported: true,
44+
name: 'node',
45+
resolvedVersion: '15.3.0',
46+
latestVersion: '>=14.*',
47+
message: '',
48+
}
49+
],
50+
}
51+
let result = writeToCsv(supportResult);
52+
expect(result).to.includes(`Support Policy Problem Detected!
53+
Please upgrade your dependencies!
54+
Your project is not within the support policy window because of outdated dependencies.`);
55+
});
56+
});

0 commit comments

Comments
 (0)