# core/stores/lexicon.store.ts

> 28 lines of code and 6 definitions.

Tree: GovLab Context
Language: typescript
Layer: application
Canonical: https://banes-lab.com/anatomy/context#file-context-core-stores-lexicon-store-ts
Source text: https://banes-lab.com/source/context/core/stores/lexicon.store.ts.txt

Listed in [core/stores](https://banes-lab.com/api/source/context/core/stores.md), after [core/stores/check.store.ts](https://banes-lab.com/source/context/core/stores/check.store.ts.md) and before [core/stores/ontology.store.ts](https://banes-lab.com/source/context/core/stores/ontology.store.ts.md).

## Definitions

- `base` (lexical_declaration, line 20, exported)
- `constructor` (method_definition, line 12, exported)
- `LexiconStore` (class_declaration, line 9, exported)
- `resolveId` (public_field_definition, line 10, exported)
- `aliasByKey` (lexical_declaration, line 21, exported)
- `resolve` (public_field_definition, line 30, exported)

## Contained in

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

## Uses

- [core/converters/identifier.converter.ts](https://banes-lab.com/source/context/core/converters/identifier.converter.ts.md)
- [core/loaders/lexicon.loader.ts](https://banes-lab.com/source/context/core/loaders/lexicon.loader.ts.md)

## Linked from

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

## Source

```typescript
import type { Lexicon, LexiconOptions, Term, TermFilter } from "#types/lexicon.types";
import { BaseOntology } from "#core/stores/ontology.store";
import { COLLECTIONS } from "#configuration/constants/ontology.constants";
import { ReadAudit } from "#core/observers/record.observer";
import { loadTerms } from "#core/loaders/lexicon.loader";
import { matchesTerm } from "#core/matchers/lexicon.matcher";
import { slugify } from "#core/converters/identifier.converter";

export class LexiconStore extends BaseOntology<Term, TermFilter> implements Lexicon {
    private readonly resolveId: (term: string) => string;

    public constructor(options: LexiconOptions = {}, audit = new ReadAudit(COLLECTIONS.lexicon)) {
        super(loadTerms(audit, options.data), {
            audit,
            idOf: (term) => term.id,
            label: COLLECTIONS.lexicon,
            logger: options.logger,
            matches: matchesTerm,
        });
        const base = options.canonicalizeId ?? slugify;
        const aliasByKey = new Map<string, string>();
        for (const term of this.all()) {
            for (const alias of term.aliases) {
                aliasByKey.set(slugify(alias), term.id);
            }
        }
        this.resolveId = (term): string => aliasByKey.get(slugify(term)) ?? base(term);
    }

    public resolve = (target: string): Term | null => this.get(this.resolveId(target));
}
```
