UNPKG

dependency-cruiser

Version:

Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.

94 lines (84 loc) 2.53 kB
import { EOL } from "node:os"; import figures from "figures"; import chalk from "chalk"; const DEFAULT_OPTIONS = { highlightFocused: false, }; /** * * @param {import("../../types/cruise-result").IModule} pModule * @param {Set<string>} pModulesInFocus * @param {boolean} pHighlightFocused * @returns {any} */ function toFlatModuleDependencies(pModule, pModulesInFocus, pHighlightFocused) { return pModule.dependencies.map((pDependency) => ({ from: { name: pModule.source, highlight: pHighlightFocused && Boolean(pModule.matchesFocus), }, to: { name: pDependency.resolved, highlight: pHighlightFocused && pModulesInFocus.has(pDependency.resolved), }, })); } function toFlatDependencies(pModules, pModulesInFocus, pHighlightFocused) { return pModules.reduce( (pAll, pModule) => pAll.concat( toFlatModuleDependencies(pModule, pModulesInFocus, pHighlightFocused) ), [] ); } function stringifyModule(pModule) { return pModule.highlight ? chalk.underline(pModule.name) : pModule.name; } function stringify(pFlatDependency) { return `${stringifyModule(pFlatDependency.from)} ${ figures.arrowRight } ${stringifyModule(pFlatDependency.to)}`; } /** * * @param {import("../../types/cruise-result").IModule[]} pModules * @returns {Set<string>} */ function getModulesInFocus(pModules) { return new Set( pModules .filter((pModule) => pModule.matchesFocus || pModule.matchesReaches) .map((pModule) => pModule.source) ); } /** * * @param {import("../../types/cruise-result").ICruiseResult} pResults * @param {import("../../types/reporter-options").ITextReporterOptions} pOptions * @returns {string} */ function report(pResults, pOptions) { const lOptions = { ...DEFAULT_OPTIONS, ...pOptions }; return toFlatDependencies( pResults.modules, getModulesInFocus(pResults.modules), lOptions.highlightFocused === true ).reduce( (pAll, pDependency) => pAll.concat(stringify(pDependency)).concat(EOL), "" ); } /** * Returns the results of a cruise in a text only format * - for each dependency the from and the two, separated by an arrow. * @param {import("../../types/cruise-result").ICruiseResult} pResults * @param {import("../../types/reporter-options").ITextReporterOptions} pOptions * @returns {import("../../types/dependency-cruiser").IReporterOutput} */ export default function text(pResults, pOptions) { return { output: report(pResults, pOptions || {}), exitCode: 0, }; }