core/converters/snapshot.converter.ts

core/converters/snapshot.converter.ts is a file in Bane's Lab Build Scripts. 54 lines of code and 7 definitions.

import type {
    AnatomyFile,
    AnatomyFolder,
    AnatomySnapshot,
    DefinitionRef,
    DefinitionView,
    FindingView,
} from "@banes-lab/web/types/anatomy.types.js";

type Qualify = (path: string) => string;

const qualifiedRef = function qualifiedRef(qualify: Qualify, ref: DefinitionRef): DefinitionRef {
    return { ...ref, file: qualify(ref.file), id: qualify(ref.id) };
};

const qualifiedDefinition = function qualifiedDefinition(qualify: Qualify, definition: DefinitionView): DefinitionView {
    return {
        ...definition,
        callees: definition.callees.map((ref) => qualifiedRef(qualify, ref)),
        callers: definition.callers.map((ref) => qualifiedRef(qualify, ref)),
        file: qualify(definition.file),
        id: qualify(definition.id),
    };
};

const qualifiedFinding = function qualifiedFinding(qualify: Qualify, finding: FindingView): FindingView {
    return { ...finding, file: qualify(finding.file) };
};

const qualifiedFile = function qualifiedFile(qualify: Qualify, file: AnatomyFile): AnatomyFile {
    return {
        ...file,
        definitions: file.definitions.map((definition) => qualifiedDefinition(qualify, definition)),
        findings: file.findings.map((finding) => qualifiedFinding(qualify, finding)),
        id: qualify(file.id),
        path: qualify(file.path),
    };
};

const qualifiedFolder = function qualifiedFolder(qualify: Qualify, folder: AnatomyFolder): AnatomyFolder {
    return {
        ...folder,
        files: folder.files.map((file) => qualifiedFile(qualify, file)),
        findings: folder.findings.map((finding) => qualifiedFinding(qualify, finding)),
        folders: folder.folders.map((child) => qualifiedFolder(qualify, child)),
        id: qualify(folder.id),
        path: qualify(folder.path),
    };
};

export const qualifiedSnapshot = function qualifiedSnapshot(
    snapshot: AnatomySnapshot,
    qualify: Qualify,
): AnatomySnapshot {
    return {
        ...snapshot,
        findings: snapshot.findings.map((finding) => qualifiedFinding(qualify, finding)),
        imports: snapshot.imports.map((edge) => ({ ...edge, from: qualify(edge.from), to: qualify(edge.to) })),
        tree: qualifiedFolder(qualify, snapshot.tree),
    };
};