# core/loaders/emitter.loader.ts

> 34 lines of code and 11 definitions.

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

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

## Definitions

- `isListOf` (lexical_declaration, line 12)
- `loadFormatters` (lexical_declaration, line 39, exported)
- `isStringRecord` (lexical_declaration, line 16)
- `isEmitTokens` (lexical_declaration, line 20)
- `loadDescriptors` (lexical_declaration, line 24, exported)
- `loadEmitTokens` (lexical_declaration, line 34, exported)
- `DESCRIPTOR_FILE` (lexical_declaration, line 8)
- `TOKENS_FILE` (lexical_declaration, line 9)
- `FORMATTER_SUFFIX` (lexical_declaration, line 10)
- `{ deferred, descriptors, pluginParent }` (lexical_declaration, line 26, exported)
- `raw` (lexical_declaration, line 35, exported)

## Contained in

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

## Uses

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

## Used by

- [core/emitters/tool.emitter.ts](https://banes-lab.com/source/quality/core/emitters/tool.emitter.ts.md)

## Linked from

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

## Source

```typescript
import type { DescriptorFile, EmitTokens } from "#types/emitter.types";
import { absolutePath } from "@ssot/paths";
import { importFolder } from "#core/loaders/folder.loader";
import { isRecord } from "#core/selectors/record.selector";
import { jsonRecord } from "#core/parsers/record.parser";
import { readFileSync } from "node:fs";

const DESCRIPTOR_FILE = "emitter.data.json";
const TOKENS_FILE = "emit-tokens.generated.json";
const FORMATTER_SUFFIX = ".formatter.ts";

const isListOf = function isListOf<T>(value: unknown): value is T[] {
    return Array.isArray(value);
};

const isStringRecord = function isStringRecord(value: unknown): value is Record<string, string> {
    return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
};

const isEmitTokens = function isEmitTokens(value: unknown): value is EmitTokens {
    return isRecord(value);
};

export const loadDescriptors = function loadDescriptors(): DescriptorFile {
    const raw = jsonRecord(readFileSync(absolutePath("govlab.quality.data", DESCRIPTOR_FILE), "utf8"));
    const { deferred, descriptors, pluginParent } = raw;
    return {
        deferred: isListOf<DescriptorFile["deferred"][number]>(deferred) ? deferred : [],
        descriptors: isListOf<DescriptorFile["descriptors"][number]>(descriptors) ? descriptors : [],
        pluginParent: isStringRecord(pluginParent) ? pluginParent : {},
    };
};

export const loadEmitTokens = function loadEmitTokens(): EmitTokens {
    const raw = jsonRecord(readFileSync(absolutePath("govlab.quality.generated", TOKENS_FILE), "utf8"));
    return isEmitTokens(raw["tokens"]) ? raw["tokens"] : {};
};

export const loadFormatters = async function loadFormatters(): Promise<void> {
    await importFolder("govlab.quality.formatters", FORMATTER_SUFFIX);
};
```
