# core/resolvers/canon.resolver.ts

> 16 lines of code and 5 definitions.

Tree: GovLab Quality
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-resolvers-canon-resolver-ts
Source text: https://banes-lab.com/source/quality/core/resolvers/canon.resolver.ts.txt

Listed in [core/resolvers](https://banes-lab.com/api/source/quality/core/resolvers.md), before [core/resolvers/coverage.resolver.ts](https://banes-lab.com/source/quality/core/resolvers/coverage.resolver.ts.md).

## Definitions

- `buildCanonIndex` (lexical_declaration, line 4, exported)
- `index` (lexical_declaration, line 5, exported)
- `refs` (lexical_declaration, line 7, exported)
- `canonFor` (lexical_declaration, line 15, exported)
- `bare` (lexical_declaration, line 16, exported)

## Contained in

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

## Uses

- [core/loaders/quality.loader.ts](https://banes-lab.com/source/quality/core/loaders/quality.loader.ts.md)

## Linked from

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

## Source

```typescript
import { CONCEPT_PREFIX } from "#configuration/constants/canon.constants";
import { loadQualityData } from "#core/loaders/quality.loader";

export const buildCanonIndex = function buildCanonIndex(): Map<string, string[]> {
    const index = new Map<string, string[]>();
    for (const rule of loadQualityData().rules) {
        const refs = (rule.canonical ?? []).map((concept) => `${CONCEPT_PREFIX}${concept}`);
        if (refs.length > 0) {
            index.set(rule.ruleId, [...new Set([...(index.get(rule.ruleId) ?? []), ...refs])]);
        }
    }
    return index;
};

export const canonFor = function canonFor(ruleId: string, index: ReadonlyMap<string, string[]>): string[] {
    const bare = ruleId.slice(ruleId.lastIndexOf("/") + 1);
    return index.get(ruleId) ?? index.get(bare) ?? [];
};
```
