# core/loaders/registry.loader.ts

> 48 lines of code and 13 definitions.

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

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

## Definitions

- `apply` (lexical_declaration, line 32)
- `loadUserRegistries` (lexical_declaration, line 44, exported)
- `DEFAULT_KEY` (lexical_declaration, line 8)
- `FORMS_DIR` (lexical_declaration, line 9)
- `CONCERNS_DIR` (lexical_declaration, line 10)
- `VERBS_DIR` (lexical_declaration, line 11)
- `EXTENSION_DIR` (lexical_declaration, line 13, exported)
- `isPresent` (lexical_declaration, line 15)
- `extensionDirs` (lexical_declaration, line 19, exported)
- `loadExtension` (lexical_declaration, line 23)
- `[forms, concerns, refVerbs]` (lexical_declaration, line 24)
- `builder` (lexical_declaration, line 49, exported)
- `extensions` (lexical_declaration, line 50, exported)

## Contained in

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

## Linked from

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

## Source

```typescript
import type { RegistryExtensions, UserRegistries } from "#types/manifest.types";
import { RegistryBuilder } from "#core/factories/registry.factory";
import { homedir } from "node:os";
import { join } from "node:path";
import { loadExports } from "#core/loaders/plugin.loader";
import { relativePath } from "@ssot/paths";

const DEFAULT_KEY = "default";
const FORMS_DIR = "doc-forms";
const CONCERNS_DIR = "doc-concerns";
const VERBS_DIR = "doc-verbs";

export const EXTENSION_DIR = relativePath("govlabHost.root");

const isPresent = function isPresent(value: unknown): value is unknown {
    return value !== undefined;
};

export const extensionDirs = function extensionDirs(root: string, allowGlobal: boolean): string[] {
    return [...(allowGlobal ? [join(homedir(), EXTENSION_DIR)] : []), join(root, EXTENSION_DIR)];
};

const loadExtension = async function loadExtension(dir: string): Promise<RegistryExtensions> {
    const [forms, concerns, refVerbs] = await Promise.all([
        loadExports(join(dir, FORMS_DIR), DEFAULT_KEY, isPresent),
        loadExports(join(dir, CONCERNS_DIR), DEFAULT_KEY, isPresent),
        loadExports(join(dir, VERBS_DIR), DEFAULT_KEY, isPresent),
    ]);
    return { concerns, forms, refVerbs };
};

const apply = function apply(builder: RegistryBuilder, extension: RegistryExtensions): void {
    for (const form of extension.forms) {
        builder.addForm(form);
    }
    for (const entry of extension.concerns) {
        builder.addConcern(entry);
    }
    for (const entry of extension.refVerbs) {
        builder.addRefVerb(entry);
    }
};

export const loadUserRegistries = async function loadUserRegistries(
    root: string,
    base: UserRegistries,
    options: { allowGlobal?: boolean } = {},
): Promise<UserRegistries> {
    const builder = new RegistryBuilder(base);
    const extensions = await Promise.all(extensionDirs(root, options.allowGlobal ?? false).map(loadExtension));
    for (const extension of extensions) {
        apply(builder, extension);
    }
    return builder.frozen();
};
```
