domain/converters/graph.converter.ts
domain/converters/graph.converter.ts is a file in Bane's Lab Site. 47 lines of code and 12 definitions.
import type { AnatomyFolder, AnatomySnapshot } from "#types/anatomy.types";
import { FILES_NOUN, FILE_NOUN, IMPORTS_NOUN, IMPORT_NOUN, ROOT_LABEL } from "#configuration/strings/folder.strings";
import {
IMPORT_DIAGRAM_HEADER,
STATS_SEPARATOR,
STRUCTURE_ARROW,
STRUCTURE_DIAGRAM_HEADER,
} from "#configuration/constants/anatomy.constants";
import { diagram, edgeLine, node } from "#domain/converters/ontology.graph.converter";
import { nounFor } from "#core/converters/text.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)} ${nounFor(edge.count, IMPORT_NOUN, IMPORTS_NOUN)}${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;
const { files } = folder.stats;
return `${folder.name}${STATS_SEPARATOR}${String(files)} ${nounFor(files, FILE_NOUN, FILES_NOUN)}${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),
]);
};