UNPKG

dependency-cruiser

Version:

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

60 lines (52 loc) 1.83 kB
import has from "lodash/has.js"; import IndexedModuleGraph from "./indexed-module-graph.mjs"; import { moduleMatchesFilter } from "./match-facade.mjs"; function getFocusModules(pModules, pFilter) { return pModules.filter((pModule) => moduleMatchesFilter(pModule, pFilter)); } function tag(pModuleNamesSet) { return (pModule) => ({ ...pModule, matchesFocus: pModuleNamesSet.has(pModule.source), }); } function scrub(pModuleNamesSet) { return (pModule) => ({ ...pModule, dependencies: pModule.dependencies.filter(({ resolved }) => pModuleNamesSet.has(resolved) ), }); } /** * * @param {import("../../types/dependency-cruiser.js").IModule[]} pModules * @param {import("../../types/strict-filter-types.js").IStrictFocusType} pFilter * @returns */ export default function addFocus(pModules, pFilter) { if (has(pFilter, "path")) { const lDepth = typeof pFilter.depth === "undefined" ? 1 : pFilter.depth; const lFocusedModuleNames = getFocusModules(pModules, pFilter).map( ({ source }) => source ); let lReachableModuleNamesArray = []; let lIndexedModules = new IndexedModuleGraph(pModules); for (let lFocusedModule of lFocusedModuleNames) { lReachableModuleNamesArray = lReachableModuleNamesArray .concat( lIndexedModules.findTransitiveDependents(lFocusedModule, lDepth) ) .concat( lIndexedModules.findTransitiveDependencies(lFocusedModule, lDepth) ); } const lFocusedModuleNamesSet = new Set(lFocusedModuleNames); const lReachableModuleNamesSet = new Set(lReachableModuleNamesArray); return pModules .filter(({ source }) => lReachableModuleNamesSet.has(source)) .map(scrub(lReachableModuleNamesSet)) .map(tag(lFocusedModuleNamesSet)); } return pModules; }