UNPKG

decode-deps

Version:
159 lines (158 loc) 4.45 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function (t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import { getFileSize } from "./fileUtils.js"; import path from "path"; import * as fs from "fs"; var packageJsonPath = path.resolve(process.cwd(), "package.json"); var packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8")); var allDependencies = __assign( __assign({}, packageJson.dependencies), packageJson.devDependencies ); var allDependenciesName = Object.keys(allDependencies); export var buildTree = function (deps) { var nodesMap = {}; var getNode = function (id) { var fileRoot = id.split("/"); var fileName = fileRoot[fileRoot.length - 1].split(".")[0]; if (!nodesMap[id]) { nodesMap[id] = { id: id, children: [], size: getFileSize(id), linkType: allDependenciesName.includes(fileName) ? "external" : "internal", }; } return nodesMap[id]; }; var _loop_1 = function (file) { var parentNode = getNode(file); deps[file].forEach(function (dependency) { var childNode = getNode(dependency); if (!parentNode.children.includes(childNode)) { parentNode.children.push(childNode); } }); }; for (var file in deps) { _loop_1(file); } return Object.values(nodesMap).filter(function (node) { return node.id in deps; }); }; export var extractNodesAndLinks = function (trees) { var nodes = []; var links = []; var warning = []; var visited = new Set(); function getNodes(node) { var fileRoot = node.id.split("/"); var fileName = fileRoot[fileRoot.length - 1].split(".")[0]; var newNode = { id: node.id, size: node.size, linkType: allDependenciesName.includes(fileName) ? "external" : "internal", }; if (!visited.has(newNode.id)) { visited.add(newNode.id); nodes.push(newNode); if (node.children) { node.children.forEach(function (child) { links.push({ source: node.id, target: child.id, linkType: allDependenciesName.includes(node.id) || allDependenciesName.includes(child.id) ? "external" : "internal", }); getNodes(child); }); } } } trees.forEach(function (tree) { getNodes(tree); }); return { nodes: nodes, links: links, warning: warning }; }; export function detectCircularDeps(links) { var visited = new Set(); var circularDependencies = []; function visit(node, path) { if (path.includes(node)) { var cycleStartIndex = path.indexOf(node); var circularPath = path.slice(cycleStartIndex, cycleStartIndex + 2); circularDependencies.push({ circular: circularPath }); return true; } if (visited.has(node)) return false; visited.add(node); path.push(node); for (var _i = 0, links_2 = links; _i < links_2.length; _i++) { var link = links_2[_i]; if (link.source === node) { visit(link.target, path); } } path.pop(); return false; } for (var _i = 0, links_1 = links; _i < links_1.length; _i++) { var link = links_1[_i]; if (!visited.has(link.source)) { visit(link.source, []); } } return circularDependencies; } export function removeCircularDeps(obj) { var seen = new WeakSet(); function recurse(value) { if (typeof value !== "object" || value === null) return value; if (seen.has(value)) return "[Circular]"; seen.add(value); if (Array.isArray(value)) { return value.map(recurse); } else { var newObj = {}; for (var key in value) { newObj[key] = recurse(value[key]); } return newObj; } } return recurse(obj); } export function removeDuplicateCircularDeps(dependencies) { var uniqueDeps = new Set(); var result = []; dependencies.forEach(function (dep) { var sortedDep = dep.circular.slice().sort(); var key = sortedDep.join("-"); if (!uniqueDeps.has(key)) { uniqueDeps.add(key); result.push(dep); } }); return result; }