UNPKG

2.31 kBJavaScriptView Raw
1const fs = require('fs');
2
3const chalk = require('chalk');
4const glob = require('glob');
5
6const audits = require('../audits');
7
8async function handler(options) {
9 const {baseDir, reports = ''} = options;
10 const onlyShowReports = reports.length > 0 ? reports.split(',') : [];
11 const showAllReports = onlyShowReports.length === 0;
12
13 const dependents = glob.sync('**/*.svg', {cwd: baseDir});
14
15 const contentPerDependent = dependents.reduce((memo, filename) => {
16 return Object.assign(memo, {
17 [filename]: fs.readFileSync(`${baseDir}/${filename}`, 'utf8'),
18 });
19 }, {});
20
21 const auditPromises = audits
22 .filter((auditFn) => {
23 return showAllReports || onlyShowReports.includes(auditFn.auditName);
24 })
25 .map((auditFn) => {
26 const filterFn = auditFn.filter ? auditFn.filter : () => true;
27 const filenames = dependents.filter(filterFn);
28 const contentPerFilename = filenames.reduce((memo, filename) => {
29 return Object.assign(memo, {[filename]: contentPerDependent[filename]});
30 }, {});
31
32 return Promise.resolve(
33 auditFn({
34 baseDir,
35 filenames,
36 contentPerFilename,
37 }),
38 ).then((result) => ({
39 name: auditFn.auditName,
40 result,
41 }));
42 });
43
44 const auditResults = await Promise.all(auditPromises);
45 const output = auditResults.map(outputResult).join('\n\n\n');
46
47 process.exitCode = auditResults.some(auditHasError) ? 1 : 0;
48 console.log(output);
49}
50
51function auditHasError({result}) {
52 return result.status === 'error';
53}
54
55function outputResult({name, result}) {
56 const statusCol = statusColor(result.status);
57 let rtn = chalk`{${statusCol} [${result.status}] ${name}}: ${result.summary}`;
58
59 if (result.info && result.info.length) {
60 rtn += `\n${result.info}`;
61 }
62
63 return rtn;
64}
65
66function statusColor(status) {
67 const lookup = {
68 pass: 'green',
69 warning: 'yellow',
70 error: 'red',
71 info: 'blue',
72 };
73
74 // eslint-disable-next-line no-prototype-builtins
75 return lookup.hasOwnProperty(status) ? lookup[status] : 'red';
76}
77
78module.exports = {
79 command: 'audit <baseDir>',
80 describe: 'audit svgs in a given folder',
81 builder: {
82 reports: {
83 type: 'string',
84 describe: 'A comma-separated list of report names to run',
85 },
86 },
87 handler,
88};