core/converters/walk.converter.ts

core/converters/walk.converter.ts is a file in Bane's Lab Build Scripts. 91 lines of code and 30 definitions.

import type { AnatomyFolder, WalkRef } from "@banes-lab/web/types/anatomy.types.js";
import { type FileEntry, type WalkCell, packCells, renderHexGrid, walkCells } from "@govlab/patterns";
import type { AnatomyRecords } from "@banes-lab/web/types/record.types.js";
import type { SourceReferences } from "@banes-lab/web/types/code.types.js";
import type { WalkAssets } from "#types/anatomy.types";
import { digestedFileName } from "#core/resolvers/asset.resolver";

const WALK_PREFIX = "walk.";
const VECTOR_SUFFIX = ".generated.svg";
const CELLS_SUFFIX = ".generated.json";
const SOURCE_PREFIX = "source.";
const SOURCE_SUFFIX = ".generated.txt";
const REFERENCES_PREFIX = "references.";
const RECORDS_PREFIX = "records.";
const PAGE_SEPARATOR = "__";
const PATH_SEPARATOR = "/";
const ROOT_PAGE = "code";

const writeCells = function writeCells(assets: WalkAssets, name: string, cells: readonly WalkCell[]): void {
    assets.cells.set(name, cells);
    assets.walks.set(name, JSON.stringify(packCells(cells)));
};

const walkRefOf = function walkRefOf(assets: WalkAssets, vector: string, cells: readonly WalkCell[]): WalkRef {
    const stem = digestedFileName(WALK_PREFIX, vector, "");
    const vectorName = stem + VECTOR_SUFFIX;
    const cellsName = stem + CELLS_SUFFIX;
    assets.walks.set(vectorName, vector);
    writeCells(assets, cellsName, cells);
    return { cells: cellsName, steps: cells.length, vector: vectorName };
};

export const pageIdOf = function pageIdOf(path: string): string {
    return path === "" ? ROOT_PAGE : path.split(PATH_SEPARATOR).join(PAGE_SEPARATOR);
};

export const folderWalkOf = function folderWalkOf(
    assets: WalkAssets,
    path: string,
    vectors: ReadonlyMap<string, string>,
    cells: ReadonlyMap<string, readonly WalkCell[]>,
): WalkRef | null {
    const id = pageIdOf(path);
    const vector = vectors.get(id);
    const walk = cells.get(id);
    return vector === undefined || walk === undefined ? null : walkRefOf(assets, vector, walk);
};

export const fileWalkOf = function fileWalkOf(
    assets: WalkAssets,
    entry: FileEntry | null,
    flagged: ReadonlyMap<string, string>,
): WalkRef | null {
    if (entry === null || entry.walk.length === 0) {
        return null;
    }
    return walkRefOf(assets, renderHexGrid(entry.walk, { flagged, title: entry.rel }), walkCells(entry.walk, flagged));
};

export const sourceOf = function sourceOf(assets: WalkAssets, text: string): string {
    const name = digestedFileName(SOURCE_PREFIX, text, SOURCE_SUFFIX);
    assets.sources.set(name, text);
    return name;
};

const qualifyCells = function qualifyCells(assets: WalkAssets, ref: WalkRef, qualify: (path: string) => string): void {
    const held = assets.cells.get(ref.cells);
    if (held === undefined) {
        return;
    }
    const cells = held.map((cell) => (cell.file.length === 0 ? cell : { ...cell, file: qualify(cell.file) }));
    writeCells(assets, ref.cells, cells);
};

export const qualifyWalks = function qualifyWalks(
    folder: AnatomyFolder,
    qualify: (path: string) => string,
    assets: WalkAssets,
): void {
    for (const ref of [folder.walk, ...folder.files.map((file) => file.walk)]) {
        if (ref !== null) {
            qualifyCells(assets, ref, qualify);
        }
    }
    for (const child of folder.folders) {
        qualifyWalks(child, qualify, assets);
    }
};

export const referencesAssetOf = function referencesAssetOf(assets: WalkAssets, references: SourceReferences): string {
    const text = JSON.stringify(references);
    const name = digestedFileName(REFERENCES_PREFIX, text, CELLS_SUFFIX);
    assets.sources.set(name, text);
    return name;
};

export const recordsAssetOf = function recordsAssetOf(assets: WalkAssets, records: AnatomyRecords): string {
    const text = JSON.stringify(records);
    const name = digestedFileName(RECORDS_PREFIX, text, CELLS_SUFFIX);
    assets.sources.set(name, text);
    return name;
};