# core/resolvers/rule.resolver.ts

> 31 lines of code and 7 definitions.

Tree: Bane's Lab Build Scripts
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/build-scripts#file-build-scripts-core-resolvers-rule-resolver-ts
Source text: https://banes-lab.com/source/build-scripts/core/resolvers/rule.resolver.ts.txt

Listed in [core/resolvers](https://banes-lab.com/api/source/build-scripts/core/resolvers.md), after [core/resolvers/route.resolver.ts](https://banes-lab.com/source/build-scripts/core/resolvers/route.resolver.ts.md).

## Definitions

- `ruleRecordsOf` (lexical_declaration, line 5, exported)
- `concepts` (lexical_declaration, line 9, exported)
- `held` (lexical_declaration, line 11, exported)
- `refs` (lexical_declaration, line 19, exported)
- `only` (lexical_declaration, line 20, exported)
- `catalogRuleRecord` (lexical_declaration, line 28, exported)
- `resolved` (lexical_declaration, line 31, exported)

## Contained in

- [core/resolvers](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-resolvers.md)

## Source

```typescript
import type { CatalogRule } from "#types/anatomy.types";
import { canonRefsFor } from "@govlab/quality/configuration/quality/generated/canon.generated.ts";
import { createQualityRelations } from "@govlab/quality/relations";

export const ruleRecordsOf = function ruleRecordsOf(
    rules: readonly CatalogRule[],
    records: ReadonlySet<string>,
): ReadonlyMap<string, string> {
    const concepts = new Map<string, Set<string>>();
    for (const rule of rules) {
        const held = concepts.get(rule.ruleId) ?? new Set<string>();
        for (const concept of rule.canonical ?? []) {
            held.add(concept);
        }
        concepts.set(rule.ruleId, held);
    }
    const resolved = new Map<string, string>();
    for (const [id, held] of concepts) {
        const refs = [...new Set(canonRefsFor([...held]))].filter((ref) => records.has(ref));
        const only = refs.find(() => refs.length === 1);
        if (only !== undefined) {
            resolved.set(id, only);
        }
    }
    return resolved;
};

export const catalogRuleRecord = function catalogRuleRecord(
    records: ReadonlySet<string>,
): (text: string) => string | null {
    const resolved = ruleRecordsOf(createQualityRelations().rules(), records);
    return (text) => resolved.get(text) ?? null;
};
```
