core/producers/quality.producer.ts

core/producers/quality.producer.ts is a file in GovLab Quality. 91 lines of code and 14 definitions.

import type { CatalogProduct, CatalogRule } from "#types/catalog.types";
import { isRecord, recordAt, stringField } from "#core/selectors/record.selector";
import { PROJECT_TOOL } from "#configuration/constants/validation.constants";
import { byRuleId } from "#core/comparators/rule.comparator";
import contextPlugin from "#core/plugins/context.plugin";
import { defineProducer } from "#core/registries/producer.registry";
import eslintPlugin from "#core/plugins/eslint.plugin";
import { loadValidators } from "#core/coordinators/validation.coordinator";
import { meta as stylelintMeta } from "#core/plugins/stylelint.plugin";

const ESLINT_PLUGINS = [
    { plugin: eslintPlugin, tool: "govlab-eslint" },
    { plugin: contextPlugin, tool: "govlab-context" },
];

const orNull = function orNull(value: string): string | null {
    return value === "" ? null : value;
};

const pluginRules = function pluginRules(plugin: unknown, tool: string): CatalogRule[] {
    const rules = isRecord(plugin) ? recordAt(plugin, "rules") : {};
    return Object.entries(rules).map(([name, rule]): CatalogRule => {
        const meta = isRecord(rule) ? recordAt(rule, "meta") : {};
        const docs = recordAt(meta, "docs");
        const { canonical } = docs;
        return {
            canonical: Array.isArray(canonical) && canonical.length > 0 ? canonical : null,
            category: orNull(stringField(docs, "category")) ?? orNull(stringField(meta, "type")) ?? "govlab",
            deprecated: meta["deprecated"] === true,
            description: orNull(stringField(docs, "description")),
            ecosystem: "javascript",
            fixable: orNull(stringField(meta, "fixable")),
            name,
            recommended: true,
            ruleId: name,
            tool,
            url: orNull(stringField(docs, "url")),
        };
    });
};

const eslintProduct = function eslintProduct(): CatalogProduct {
    const rules = ESLINT_PLUGINS.flatMap(({ plugin, tool }) => pluginRules(plugin, tool)).toSorted((a, b) => {
        const left = `${String(a["tool"])}${a.ruleId}`;
        const right = `${String(b["tool"])}${b.ruleId}`;
        return left === right ? 0 : (left < right ? -1 : 1);
    });
    const byTool: Record<string, number> = {};
    for (const rule of rules) {
        const tool = String(rule["tool"]);
        byTool[tool] = (byTool[tool] ?? 0) + 1;
    }
    return { rules, source: "govlab", summary: { byTool, tool: "govlab-eslint", total: rules.length } };
};

const stylelintProduct = function stylelintProduct(): CatalogProduct {
    const rules = stylelintMeta
        .map((entry): CatalogRule => ({
            canonical: entry.meta.canonical.length > 0 ? entry.meta.canonical : null,
            category: "govlab",
            deprecated: false,
            description: orNull(entry.meta.description),
            ecosystem: "css",
            fixable: null,
            name: entry.ruleName,
            recommended: true,
            ruleId: entry.ruleName,
            tool: "govlab-stylelint",
            url: orNull(entry.meta.url ?? ""),
        }))
        .toSorted(byRuleId);
    return { rules, source: "govlab-stylelint", summary: { tool: "govlab-stylelint", total: rules.length } };
};

const nativeProduct = async function nativeProduct(): Promise<CatalogProduct> {
    const rules = (await loadValidators())
        .map((validator): CatalogRule => ({
            canonical: validator.meta.canonical.length > 0 ? [...validator.meta.canonical] : null,
            category: "cross-file",
            deprecated: false,
            description: validator.meta.description,
            ecosystem: "typescript",
            fixable: false,
            name: validator.id,
            recommended: true,
            ruleId: validator.id,
            tool: PROJECT_TOOL,
            url: null,
        }))
        .toSorted(byRuleId);
    return { rules, source: PROJECT_TOOL, summary: { tool: PROJECT_TOOL, total: rules.length } };
};

defineProducer({
    name: "quality",
    produce: async () => [eslintProduct(), stylelintProduct(), await nativeProduct()],
    refresh: "build",
});