# core/loaders/quality.loader.ts

> 60 lines of code and 17 definitions.

Tree: GovLab Docs
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-loaders-quality-loader-ts
Source text: https://banes-lab.com/source/docs/core/loaders/quality.loader.ts.txt

Listed in [core/loaders](https://banes-lab.com/api/source/docs/core/loaders.md), after [core/loaders/plugin.loader.ts](https://banes-lab.com/source/docs/core/loaders/plugin.loader.ts.md) and before [core/loaders/registry.loader.ts](https://banes-lab.com/source/docs/core/loaders/registry.loader.ts.md).

## Definitions

- `loadConceptMap` (lexical_declaration, line 54, exported)
- `loadConceptIds` (lexical_declaration, line 66, exported)
- `conceptsOf` (lexical_declaration, line 15)
- `buildByTool` (lexical_declaration, line 28)
- `GOVLAB_TOOL_PREFIX` (lexical_declaration, line 5)
- `CONCEPTS_KEY` (lexical_declaration, line 6)
- `TOOL_BY_SLUG` (lexical_declaration, line 8)
- `{ canonical }` (lexical_declaration, line 16)
- `toolOf` (lexical_declaration, line 23)
- `{ tool }` (lexical_declaration, line 24)
- `loadGovernanceDeriver` (lexical_declaration, line 39, exported)
- `parsed` (lexical_declaration, line 42, exported)
- `byTool` (lexical_declaration, line 43, exported)
- `tool` (lexical_declaration, line 45, exported)
- `data` (lexical_declaration, line 55, exported)
- `concepts` (lexical_declaration, line 56, exported)
- `map` (lexical_declaration, line 57, exported)

## Contained in

- [core/loaders](https://banes-lab.com/anatomy/docs/folder-docs-core-loaders.md)

## Uses

- [core/predicates/record.predicate.ts](https://banes-lab.com/source/docs/core/predicates/record.predicate.ts.md)

## Used by

- [core/plugins/manifest.quality.plugin.ts](https://banes-lab.com/source/docs/core/plugins/manifest.quality.plugin.ts.md)

## Linked from

- [core/loaders](https://banes-lab.com/anatomy/docs/folder-docs-core-loaders.md)
- [core/plugins](https://banes-lab.com/anatomy/docs/folder-docs-core-plugins.md)
- [core/predicates](https://banes-lab.com/anatomy/docs/folder-docs-core-predicates.md)

## Source

```typescript
import type { ConceptRecord } from "#types/readme.types";
import { isRecord } from "#core/predicates/record.predicate";
import { readJsonSafe } from "#core/loaders/base.loader";

const GOVLAB_TOOL_PREFIX = "govlab";
const CONCEPTS_KEY = "concepts";

const TOOL_BY_SLUG: ReadonlyMap<string, string> = new Map([
    ["context-lint", "govlab-context"],
    ["eslint-plugin", "govlab-eslint"],
    ["quality-engine", "govlab-native"],
    ["stylelint-plugin", "govlab-stylelint"],
]);

const conceptsOf = function conceptsOf(rule: Record<string, unknown>): string[] {
    const { canonical } = rule;
    if (Array.isArray(canonical)) {
        return canonical.filter((concept): concept is string => typeof concept === "string" && concept.length > 0);
    }
    return typeof canonical === "string" && canonical.length > 0 ? [canonical] : [];
};

const toolOf = function toolOf(rule: Record<string, unknown>): string | null {
    const { tool } = rule;
    return typeof tool === "string" && tool.startsWith(GOVLAB_TOOL_PREFIX) ? tool : null;
};

const buildByTool = function buildByTool(rules: readonly unknown[]): Map<string, Set<string>> {
    const byTool = new Map<string, Set<string>>();
    for (const rule of rules) {
        const tool = isRecord(rule) ? toolOf(rule) : null;
        if (tool !== null && isRecord(rule)) {
            byTool.set(tool, new Set([...(byTool.get(tool) ?? []), ...conceptsOf(rule)]));
        }
    }
    return byTool;
};

export const loadGovernanceDeriver = function loadGovernanceDeriver(
    allRulesPath: string,
): (slug: string) => string[] | null {
    const parsed = readJsonSafe(allRulesPath);
    const byTool = buildByTool(Array.isArray(parsed) ? parsed : []);
    return (slug: string): string[] | null => {
        const tool = TOOL_BY_SLUG.get(slug);
        const concepts = tool === undefined ? undefined : byTool.get(tool);
        if (concepts === undefined || concepts.size === 0) {
            return null;
        }
        return [...concepts].toSorted((left, right) => left.localeCompare(right));
    };
};

export const loadConceptMap = function loadConceptMap(indexPath: string): Map<string, ConceptRecord> {
    const data = readJsonSafe(indexPath);
    const concepts = isRecord(data) && Array.isArray(data[CONCEPTS_KEY]) ? data[CONCEPTS_KEY] : [];
    const map = new Map<string, ConceptRecord>();
    for (const concept of concepts) {
        if (isRecord(concept) && typeof concept["id"] === "string" && typeof concept["dimension"] === "string") {
            map.set(concept["id"], { dimension: concept["dimension"], id: concept["id"] });
        }
    }
    return map;
};

export const loadConceptIds = function loadConceptIds(indexPath: string): Set<string> {
    return new Set(loadConceptMap(indexPath).keys());
};
```
