UNPKG

dependency-cruiser

Version:

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

95 lines (85 loc) 2.46 kB
import { styleText } from "node:util"; const DEFAULT_OPTIONS = { highlightFocused: false, }; const EOL = "\n"; /** * * @param {import("../../types/cruise-result.mjs").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 && 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 ? styleText("underline", pModule.name) : pModule.name; } function stringify(pFlatDependency) { return `${stringifyModule(pFlatDependency.from)}${stringifyModule(pFlatDependency.to)}`; } /** * * @param {import("../../types/cruise-result.mjs").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.mjs").ICruiseResult} pResults * @param {import("../../types/reporter-options.mjs").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), "", ) || 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.mjs").ICruiseResult} pResults * @param {import("../../types/reporter-options.mjs").ITextReporterOptions} pOptions * @returns {import("../../types/dependency-cruiser.mjs").IReporterOutput} */ export default function text(pResults, pOptions) { return { output: report(pResults, pOptions || {}), exitCode: 0, }; }