UNPKG

typhonjs-escomplex-commons

Version:
250 lines (220 loc) 8.27 kB
import AbstractFormatText from './AbstractFormatText'; import ReportType from '../../../types/ReportType'; import SU from '../../../utils/StringUtil'; import TransformFormat from '../../TransformFormat'; /** * Provides a format transform for ModuleReport / ProjectReport instances converting them to plain text. */ export default class FormatText extends AbstractFormatText { /** * Initializes text format. * * @param {object} headers - * @param {object} keys - * @param {string} adjacencyFormatName - * @param {string} visibilityFormatName - */ constructor(headers = {}, keys = {}, adjacencyFormatName = 'text-adjacency', visibilityFormatName = 'text-visibility') { super(Object.assign({}, s_DEFAULT_HEADERS, headers), Object.assign({}, s_DEFAULT_KEYS, keys)); this._adjacencyFormatName = adjacencyFormatName; this._visibilityFormatName = visibilityFormatName; } /** * Gets the file extension. * * @returns {string} */ get extension() { return 'txt'; } /** * Gets the format name. * * @returns {string} */ get name() { return 'text'; } /** * Gets the format type. * * @returns {string} */ get type() { return 'full'; } /** * Returns whether a given ReportType is supported by this format transform. * * @param {ReportType} reportType - A given report type. * * @returns {boolean} */ isSupported(reportType) { switch (reportType) { case ReportType.CLASS: case ReportType.CLASS_METHOD: case ReportType.MODULE_METHOD: case ReportType.MODULE: case ReportType.NESTED_METHOD: case ReportType.PROJECT: return true; default: return false; } } /** * Formats a project report as plain text. * * @param {ProjectReport} projectReport - A project report. * * @param {object} options - (Optional) One or more optional parameters passed to the formatter. * @property {string} classReport - An entry key found in the class report to output. * @property {string} methodReport - An entry key found in the method report to output. * @property {string} moduleReport - An entry key found in the module report to output. * * @returns {string} */ _formatProject(projectReport, options = {}) { let output = super._formatProject(projectReport, options); const localOptions = Object.assign({}, this._keys, options); const adjacency = typeof localOptions.adjacency === 'boolean' ? localOptions.adjacency : true; const visibility = typeof localOptions.visibility === 'boolean' ? localOptions.visibility : true; // Add adjacency matrix output if (adjacency && TransformFormat.isFormat(this._adjacencyFormatName)) { output += `\n\n${TransformFormat.format(projectReport, this._adjacencyFormatName, options)}`; } // Add visibility matrix output if (visibility && TransformFormat.isFormat(this._visibilityFormatName)) { output += `\n\n${TransformFormat.format(projectReport, this._visibilityFormatName, options)}`; } return output; } } // Module private --------------------------------------------------------------------------------------------------- /** * Provides shared method data. * @type {*[]} * @ignore */ const s_SHARED_METHOD_DATA = [ new SU.SafeEntry('Line start: ', 'lineStart'), new SU.SafeEntry('Line end: ', 'lineEnd'), new SU.SafeEntry('Physical LOC: ', 'sloc.physical'), new SU.SafeEntry('Logical LOC: ', 'sloc.logical'), new SU.SafeEntry('Cyclomatic complexity: ', 'cyclomatic'), new SU.SafeEntry('Cyclomatic complexity density: ', 'cyclomaticDensity', 1, '%'), new SU.SafeEntry('Halstead difficulty: ', 'halstead.difficulty'), new SU.SafeEntry('Halstead volume: ', 'halstead.volume'), new SU.SafeEntry('Halstead effort: ', 'halstead.effort'), new SU.SafeEntry('Parameter count: ', 'params'), new SU.SafeEntry('Error: ', 'errors') ]; /** * Provides shared average method data. * @type {*[]} * @ignore */ const s_SHARED_METHOD_AVERAGE_DATA = [ new SU.SafeEntry('Average per-function physical LOC: ', 'methodAverage.sloc.physical'), new SU.SafeEntry('Average per-function logical LOC: ', 'methodAverage.sloc.logical'), new SU.SafeEntry('Average per-function cyclomatic complexity: ', 'methodAverage.cyclomatic'), new SU.SafeEntry('Average per-function cyclomatic density: ', 'methodAverage.cyclomaticDensity', 1, '%'), new SU.SafeEntry('Average per-function halstead difficulty: ', 'methodAverage.halstead.difficulty'), new SU.SafeEntry('Average per-function halstead volume: ', 'methodAverage.halstead.volume'), new SU.SafeEntry('Average per-function halstead effort: ', 'methodAverage.halstead.effort') ]; /** * Defines the default headers as text which are inserted via spread into `StringUtil.safeStringsObject`. * @type {{classMethod: Array, classReport: Array, methodReport: *[], moduleReport: *[], projectReport: *[]}} * @ignore */ const s_DEFAULT_KEYS = { classMethod: [ ...s_SHARED_METHOD_DATA ], classReport: [ new SU.SafeEntry('Line start: ', 'lineStart'), new SU.SafeEntry('Line end: ', 'lineEnd'), ...s_SHARED_METHOD_AVERAGE_DATA, new SU.SafeEntry('Error: ', 'errors') ], methodReport: [ ...s_SHARED_METHOD_DATA ], moduleReport: [ new SU.SafeEntry('Total lines: ', 'lineEnd'), new SU.SafeEntry('Maintainability index: ', 'maintainability'), new SU.SafeEntry('Dependency count: ', 'dependencies.length'), ...s_SHARED_METHOD_AVERAGE_DATA, new SU.SafeEntry('Error: ', 'errors') ], projectReport: [ new SU.SafeEntry('First-order density: ', 'firstOrderDensity', 1, '%'), new SU.SafeEntry('Change cost: ', 'changeCost', 1, '%'), new SU.SafeEntry('Core size: ', 'coreSize', 1, '%'), new SU.SafeEntry('Average per-module maintainability index: ', 'moduleAverage.maintainability'), new SU.SafeEntry('Average per-function physical LOC: ', 'moduleAverage.methodAverage.sloc.physical'), new SU.SafeEntry('Average per-function logical LOC: ', 'moduleAverage.methodAverage.sloc.logical'), new SU.SafeEntry('Average per-function parameter count: ', 'moduleAverage.methodAverage.params'), new SU.SafeEntry('Average per-function cyclomatic complexity: ', 'moduleAverage.methodAverage.cyclomatic'), new SU.SafeEntry('Average per-function halstead difficulty: ', 'moduleAverage.methodAverage.halstead.difficulty'), new SU.SafeEntry('Average per-function halstead effort: ', 'moduleAverage.methodAverage.halstead.effort'), new SU.SafeEntry('Error: ', 'errors') ] }; /** * Defines the default headers as text which are inserted via spread into `StringUtil.safeStringsObject`. * @type {{classMethod: *[], classReport: *[], entryPrepend: string, moduleMethod: *[], moduleReport: string[], projectReport: string[]}} * @ignore */ const s_DEFAULT_HEADERS = { classMethod: [ '\n', new SU.SafeEntry('Class method: ', 'name') ], classReport: [ '\n', new SU.SafeEntry('Class: ', 'name') ], entryPrepend: '', moduleMethod: [ '\n', new SU.SafeEntry('Module method: ', 'name') ], moduleReport: [ '\n', new SU.SafeEntry('Module ', '___modulecntrplus1___', 1, ':'), new SU.SafeEntry(' File path: ', 'filePath'), new SU.SafeEntry(' Source path: ', 'srcPath'), new SU.SafeEntry(' Source alias: ', 'srcPathAlias') ], projectReport: [ 'Project: \n' ] };