UNPKG

@hint/formatter-excel

Version:

webhint formatter that outputs the result in an Excel file (xlsx)

130 lines (129 loc) 5.56 kB
"use strict"; 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;