core/validators/catalog.location.validator.ts

core/validators/catalog.location.validator.ts is a file in Bane's Lab Build Scripts. 29 lines of code and 6 definitions.

import { NO_CATALOG_SITEMAP, strayInSitemap, unlistedInSitemap } from "#configuration/strings/catalog.strings";
import { fileOfAddress, localAddress } from "#core/resolvers/catalog.resolver";
import { CATALOG_SITEMAP_ROUTE } from "#configuration/constants/site.constants";
import type { Finding } from "#types/validation.types";
import { join } from "node:path";
import { locationsOf } from "#core/converters/build.converter";
import { readFileSync } from "node:fs";
import { sitemapPartFiles } from "#core/resolvers/route.resolver";

export const sitemapFindings = function sitemapFindings(
    outDir: string,
    site: string,
    markdownLeaves: readonly string[],
    present: ReadonlySet<string>,
): Finding[] {
    const file = CATALOG_SITEMAP_ROUTE.slice(1);
    if (!present.has(file)) {
        return [{ file, message: NO_CATALOG_SITEMAP }];
    }
    const parts = sitemapPartFiles(CATALOG_SITEMAP_ROUTE, (held) => present.has(held));
    const locations = parts.flatMap((held) => locationsOf(readFileSync(join(outDir, held), "utf8")));
    const listed = new Set(locations.map((location) => fileOfAddress(localAddress(site, location))));
    const leaves = new Set(markdownLeaves);
    return [
        ...markdownLeaves
            .filter((leaf) => !listed.has(leaf))
            .map((leaf) => ({ file, message: unlistedInSitemap(leaf) })),
        ...[...listed].filter((leaf) => !leaves.has(leaf)).map((leaf) => ({ file, message: strayInSitemap(leaf) })),
    ];
};