core/loaders/coverage.loader.ts

core/loaders/coverage.loader.ts is a file in Bane's Lab Content. 38 lines of code and 10 definitions.

import {
    CONFIGURATION_CONTAINER,
    CONSTANTS_CONCERN,
    GRAPH_EXPORT_SUFFIX,
} from "#configuration/constants/coverage.constants";
import { absolutePath, relativePath } from "@ssot/paths";
import { concernSuffix, folderFor } from "@ssot/govlab/shared/manifests/taxonomy.manifest.ts";
import type { ContentGraph } from "#types/coverage.types";
import { containerPath } from "@ssot/govlab/shared/resolvers/container.resolver.ts";
import { isRecord } from "#core/selectors/payload.selector";
import { pathToFileURL } from "node:url";
import { readdirSync } from "node:fs";

const isGraph = function isGraph(value: unknown): value is ContentGraph {
    return isRecord(value) && typeof value["page"] === "string" && isRecord(value["sections"]);
};

const graphsOf = function graphsOf(module: Record<string, unknown>): ContentGraph[] {
    return Object.entries(module).flatMap(([name, value]) =>
        name.endsWith(GRAPH_EXPORT_SUFFIX) && isGraph(value) ? [value] : [],
    );
};

const constantsFolder = function constantsFolder(): string {
    const container = containerPath(CONFIGURATION_CONTAINER, relativePath("app.member"));
    return absolutePath("app.root", container, folderFor(CONSTANTS_CONCERN) ?? "");
};

const loadModule = async function loadModule(file: string): Promise<ContentGraph[]> {
    const loaded: unknown = await import(pathToFileURL(file).href);
    return isRecord(loaded) ? graphsOf(loaded) : [];
};

export const loadContentGraphs = async function loadContentGraphs(): Promise<ContentGraph[]> {
    const folder = constantsFolder();
    const suffix = concernSuffix(CONSTANTS_CONCERN);
    const files = readdirSync(folder)
        .filter((name) => name.endsWith(suffix))
        .sort((a, b) => a.localeCompare(b))
        .map((name) => `${folder}/${name}`);
    const loaded = await Promise.all(files.map(loadModule));
    return loaded.flat();
};