core/persistence/graph.persistence.ts

core/persistence/graph.persistence.ts is a file in Bane's Lab Build Scripts. 32 lines of code and 6 definitions.

import { dirname, join } from "node:path";
import { mkdirSync, readdirSync, rmSync } from "node:fs";
import { renderGraphChunk, renderGraphLoader } from "#core/formatters/graph.formatter";
import { writeCanonicalText, writeVerbatim } from "@govlab/canonical-write";
import type { GraphChunk } from "@banes-lab/web/types/graph.types.js";
import type { GraphReport } from "#types/graph.types";
import { absolutePath } from "@ssot/paths";
import { chunkFileOf } from "#core/resolvers/graph.resolver";
import { graphReport } from "#core/resolvers/catalog.resolver";
import { isChunkFile } from "#core/predicates/graph.predicate";

const JSON_INDENT = 4;

export const writeGraphReport = function writeGraphReport(report: GraphReport, file = graphReport()): void {
    mkdirSync(dirname(file), { recursive: true });
    writeVerbatim(file, JSON.stringify(report, null, JSON_INDENT));
};

export const writeGraphChunks = async function writeGraphChunks(
    chunks: ReadonlyMap<string, GraphChunk>,
    loader = absolutePath("app.graph"),
): Promise<void> {
    const folder = dirname(loader);
    const written = new Set([...chunks.keys()].map(chunkFileOf));
    for (const stale of readdirSync(folder).filter((name) => isChunkFile(name) && !written.has(name))) {
        rmSync(join(folder, stale));
    }
    const keys = [...chunks.keys()];
    await Promise.all([
        writeCanonicalText(loader, renderGraphLoader(keys)),
        ...[...chunks].map(async ([collection, chunk]) =>
            writeCanonicalText(join(folder, chunkFileOf(collection)), renderGraphChunk(chunk)),
        ),
    ]);
};