core/converters/folder.converter.ts
core/converters/folder.converter.ts is a file in Bane's Lab Build Scripts. 39 lines of code and 6 definitions.
import type { FolderRelations, FolderTools, SourceTree } from "#types/source.types";
import type { Identity, Link, Linker } from "#types/catalog.types";
import { ANATOMY_PREFIX } from "#configuration/constants/graph.constants";
import type { AnatomyFolder } from "@banes-lab/web/types/anatomy.types.js";
const linkTo = function linkTo(linker: Linker, identity: Identity | null): readonly Link[] {
return identity === null ? [] : [linker.link(identity.title, identity.ref)];
};
export const folderRelations = function folderRelations(
trees: readonly SourceTree[],
tools: FolderTools,
linker: Linker,
): ReadonlyMap<string, FolderRelations> {
const relations = new Map<string, FolderRelations>();
const visit = function visit(folder: AnatomyFolder, parent: Identity | null): void {
const self = linker.byHref(tools.folderHref(folder.path));
if (self !== null) {
const files = folder.files.flatMap((file) => [linker.byRef(ANATOMY_PREFIX + tools.fileId(file.path))]);
relations.set(self.ref, {
containedIn: parent === null ? null : linker.link(parent.title, parent.ref),
contains: [
...folder.folders.flatMap((child) => linkTo(linker, linker.byHref(tools.folderHref(child.path)))),
...files.flatMap((file) => linkTo(linker, file)),
],
});
for (const file of files) {
if (file !== null) {
relations.set(file.ref, { containedIn: linker.link(self.title, self.ref), contains: [] });
}
}
}
for (const child of folder.folders) {
visit(child, self);
}
};
for (const tree of trees) {
visit(tree.snapshot.tree, null);
}
return relations;
};