core/loaders/pattern.loader.ts

core/loaders/pattern.loader.ts is a file in GovLab Stats. 27 lines of code and 6 definitions.

import { arrayField, field, numberField, stringField } from "#core/selectors/field.selector";
import { FINDINGS_FILE } from "#configuration/constants/pattern.constants";
import type { FindingsStats } from "#types/pattern.types";
import { TOP_MODULES } from "#configuration/constants/metric.constants";
import { isRecord } from "#core/predicates/record.predicate";
import path from "node:path";
import { readJson } from "#core/loaders/data.loader";

const countMap = function countMap(value: unknown): Map<string, number> {
    return new Map(isRecord(value) ? Object.keys(value).map((key) => [key, numberField(value, key, 0)]) : []);
};

export const collectFindings = function collectFindings(root: string): FindingsStats {
    const data = readJson(path.join(root, FINDINGS_FILE));
    const summary = field(data, "summary");
    const modules = arrayField(data, "modules");
    const withFindings = modules
        .map((entry) => ({ module: stringField(entry, "module"), total: numberField(entry, "total", 0) }))
        .filter((entry) => entry.total > 0)
        .toSorted((left, right) => right.total - left.total);
    return {
        byKind: countMap(field(summary, "byKind")),
        bySeverity: countMap(field(summary, "bySeverity")),
        modules: numberField(summary, "modules", modules.length),
        modulesWithFindings: withFindings.length,
        topModules: withFindings.slice(0, TOP_MODULES),
        total: numberField(summary, "findings", 0),
    };
};