@hint/formatter-excel
Version:
webhint formatter that outputs the result in an Excel file (xlsx)
130 lines (129 loc) • 5.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const Excel = require("exceljs");
const forEach = require("lodash/forEach");
const groupBy = require("lodash/groupBy");
const sortBy = require("lodash/sortBy");
const utils_1 = require("@hint/utils");
const utils_fs_1 = require("@hint/utils-fs");
const utils_debug_1 = require("@hint/utils-debug");
const i18n_import_1 = require("./i18n.import");
const _ = {
forEach,
groupBy,
sortBy
};
const debug = (0, utils_debug_1.debug)(__filename);
const startRow = 5;
class ExcelFormatter {
async format(messages, options = {}) {
if (messages.length === 0) {
return;
}
const language = options.language;
const target = options.target || '';
const resources = _.groupBy(messages, 'resource');
const workbook = new Excel.Workbook();
const sortedResources = _.sortBy(Object.keys(resources));
const bold = { font: { bold: true } };
const mediumBorder = { style: 'medium' };
const border = {
border: {
bottom: mediumBorder,
left: mediumBorder,
right: mediumBorder,
top: mediumBorder
}
};
const rightAlign = { align: { horizontal: 'right' } };
const tableHeader = Object.assign({ fill: {
fgColor: { argb: 'FF000000' },
pattern: 'solid',
type: 'pattern'
}, font: {
bold: true,
color: { argb: 'FFFFFFFF' }
} }, border);
const names = new Map();
const getName = (name) => {
if (names.has(name)) {
return names.get(name);
}
const finalName = (0, i18n_import_1.getMessage)('resourceName', language, names.size.toString());
names.set(name, finalName);
return finalName;
};
const applyToCell = (cell, ...properties) => {
Object.assign(cell, ...properties);
};
const processResource = (msgs, resource) => {
const sortedMessages = _.sortBy(msgs, 'hintId');
const name = getName(resource);
const sheet = workbook.addWorksheet(name);
let counter = startRow;
sheet.getColumn('E').width = 25;
sheet.getColumn('F').width = 150;
applyToCell(sheet.getCell(`E${counter}`), { value: resource }, bold);
counter += 2;
applyToCell(sheet.getCell(`E${counter}`), { value: (0, i18n_import_1.getMessage)('hintId', language) }, tableHeader);
applyToCell(sheet.getCell(`F${counter}`), { value: (0, i18n_import_1.getMessage)('issue', language) }, tableHeader);
counter++;
_.forEach(sortedMessages, (problem) => {
applyToCell(sheet.getCell(`E${counter}`), {
value: {
hyperlink: `https://webhint.io/docs/user-guide/hints/hint-${problem.hintId}/`,
text: problem.hintId
}
}, border);
applyToCell(sheet.getCell(`F${counter}`), { value: problem.message }, border);
counter++;
});
};
const createSummary = (resourcesList, scannedUrl) => {
const sheet = workbook.addWorksheet((0, i18n_import_1.getMessage)('summary', language));
let counter = startRow;
sheet.getColumn('E').width = 50;
sheet.getColumn('F').width = 20;
applyToCell(sheet.getCell(`E${counter}`), { value: (0, i18n_import_1.getMessage)('summaryFor', language, scannedUrl) }, bold);
counter += 2;
applyToCell(sheet.getCell(`E${counter}`), { value: (0, i18n_import_1.getMessage)('resourceUrl', language) }, tableHeader);
applyToCell(sheet.getCell(`F${counter}`), { value: (0, i18n_import_1.getMessage)('numberOfIssues', language) }, rightAlign, tableHeader);
counter++;
_.forEach(resourcesList, (resource) => {
const resourceShortName = getName(resource);
applyToCell(sheet.getCell(`E${counter}`), {
value: {
hyperlink: `#'${resourceShortName}'!A1`,
text: resource
}
}, border);
applyToCell(sheet.getCell(`F${counter}`), { value: resources[resource].length }, border);
counter++;
});
};
debug('Formatting results');
createSummary(sortedResources, target);
_.forEach(sortedResources, (resourceName) => {
processResource(resources[resourceName], resourceName);
});
try {
const name = target.replace(/:\/\//g, '-')
.replace(/:/g, '-')
.replace(/\./g, '-')
.replace(/\//g, '-')
.replace(/-$/, '');
const fileName = options.output || path.resolve((0, utils_fs_1.cwd)(), `${name}.xlsx`);
await workbook.xlsx.writeFile(fileName);
}
catch (e) {
{
utils_1.logger.error((0, i18n_import_1.getMessage)('errorSaving', language));
if (e.message.includes('EBUSY')) {
utils_1.logger.error((0, i18n_import_1.getMessage)('maybeIsOpened', language));
}
}
}
}
}
exports.default = ExcelFormatter;