import type { AnatomyFolder, AnatomySnapshot } from "#types/anatomy.types"; import { IMPORT_DIAGRAM_HEADER, STATS_SEPARATOR, STRUCTURE_ARROW, STRUCTURE_DIAGRAM_HEADER, } from "#configuration/constants/anatomy.constants"; import { IMPORT_EDGE_LABEL, ROOT_LABEL, STRUCTURE_FILES_SUFFIX } from "#configuration/strings/folder.strings"; import { diagram, edgeLine, node } from "#domain/converters/ontology.converter"; const IMPORT_ARROW = " -- "; const IMPORT_ARROW_END = " --> "; export const importsDiagram = function importsDiagram(snapshot: AnatomySnapshot): string { const containers = [...new Set(snapshot.imports.flatMap((edge) => [edge.from, edge.to]))].sort((a, b) => a.localeCompare(b), ); const nodes = containers.map((name) => node(name, name)); const edges = snapshot.imports.map((edge) => edgeLine(edge.from, IMPORT_ARROW + String(edge.count) + IMPORT_EDGE_LABEL + IMPORT_ARROW_END, edge.to), ); return diagram(IMPORT_DIAGRAM_HEADER, [...nodes, ...edges]); }; const folderLabel = function folderLabel(folder: AnatomyFolder): string { const layer = folder.layer === null ? "" : STATS_SEPARATOR + folder.layer; return folder.name + STATS_SEPARATOR + String(folder.stats.files) + STRUCTURE_FILES_SUFFIX + layer; }; const structureLines = function structureLines(folder: AnatomyFolder): string[] { const children = folder.folders.filter((child) => child.stats.files > 0); return [ ...children.map((child) => node(child.path, folderLabel(child))), ...children.map((child) => edgeLine(folder.path === "" ? ROOT_LABEL : folder.path, STRUCTURE_ARROW, child.path), ), ...children.flatMap(structureLines), ]; }; export const structureDiagram = function structureDiagram(snapshot: AnatomySnapshot): string { return diagram(STRUCTURE_DIAGRAM_HEADER, [ node(ROOT_LABEL, folderLabel({ ...snapshot.tree, name: ROOT_LABEL })), ...structureLines(snapshot.tree), ]); };