onebeyond/license-checker

View on GitHub
src/reporter.js

Summary

Maintainability
A
0 mins
Test Coverage
F
53%
const _ = require('lodash');
const fs = require('fs');

const logger = require('./logger');

const defaultReportHeader = 'This application makes use of the following open source packages:';
const errorReportHeader = 'The following packages use invalid licenses:';

/**
 *  Generates a table in markdown format with information on the installed
 * packages, including their licenses.
 *
 * @param {object[]} packageList - List of packages to be dumped inside of the file
 */
const buildPackageTable = packageList => {
  const tableHeader = '\n| Library | Version | License | Repository |\n|---|---|---|---|\n';

  const compiled = _.template(
    `${tableHeader}<% _.forEach(report, elem => { const r = /(.*)@(.*)/.exec(elem.package); %>| <%- r[1] %> | <%- r[2] %> | <%- elem.licenses %> | <%- elem.repository %> |\n<% }); %>`
  );

  return compiled({ report: packageList });
};

/**
 * Generate report file.
 *
 * @param {string} header - Value to be used as header of the generated file
 * @returns {function}
 */
const writeReportFile = header =>
  /**
   * Generate report file.
   *
   * @param {string} outputFileName - Name of the file for the generated report
   * @param {object[]} packageList - List of packages to be dumped inside the file
   * @param {string} customHeaderFileName - Name of the file that contains the custom header
   *  to add at the beginning of the generated report
   */
  (outputFileName, packageList, customHeaderFileName) => {
    let licenseReportHeader = header;
    if (customHeaderFileName) {
      try {
        licenseReportHeader = fs.readFileSync(customHeaderFileName);
      } catch {
        logger.warn(`Failed to read file ${customHeaderFileName}, so default header will be added to the report`);
      }
    }

    const licenseTable = buildPackageTable(packageList);

    fs.writeFileSync(
    `${outputFileName}.md`,
    `${licenseReportHeader}\n${licenseTable}`,
    error => {
      if (error) {
        logger.error(`Error generating report file ${outputFileName}.md`);
        throw error;
      }
    }
    );

    logger.info(`${outputFileName}.md created!`);
  };

module.exports = {
  writeReportFile: writeReportFile(defaultReportHeader),
  writeErrorReportFile: writeReportFile(errorReportHeader)
};