# core/loaders/binding.loader.ts

> 32 lines of code and 11 definitions.

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

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

## Definitions

- `RULE_FOLDER_KEYS` (lexical_declaration, line 6)
- `RULE_MARKER` (lexical_declaration, line 12)
- `SEGMENT_SEPARATOR` (lexical_declaration, line 13)
- `RULE_FILE_SEGMENTS` (lexical_declaration, line 14)
- `MARKER_INDEX` (lexical_declaration, line 15)
- `ruleIdOf` (lexical_declaration, line 17)
- `segments` (lexical_declaration, line 18)
- `loadRuleSources` (lexical_declaration, line 24, exported)
- `folder` (lexical_declaration, line 26, exported)
- `id` (lexical_declaration, line 30, exported)
- `file` (lexical_declaration, line 31, exported)

## Contained in

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

## Source

```typescript
import { readFileSync, readdirSync } from "node:fs";
import type { RuleSource } from "#types/binding.types";
import { absolutePath } from "@ssot/paths";
import { join } from "node:path";

const RULE_FOLDER_KEYS = [
    "govlabHost.rules",
    "govlab.quality.eslintRules",
    "govlab.quality.contextRules",
    "govlab.quality.stylelintRules",
];
const RULE_MARKER = "rule";
const SEGMENT_SEPARATOR = ".";
const RULE_FILE_SEGMENTS = 4;
const MARKER_INDEX = 2;

const ruleIdOf = function ruleIdOf(name: string): string | null {
    const segments = name.split(SEGMENT_SEPARATOR);
    return segments.length === RULE_FILE_SEGMENTS && segments[MARKER_INDEX] === RULE_MARKER
        ? (segments[0] ?? null)
        : null;
};

export const loadRuleSources = function loadRuleSources(): RuleSource[] {
    return RULE_FOLDER_KEYS.flatMap((key) => {
        const folder = absolutePath(key);
        return readdirSync(folder)
            .toSorted((a, b) => a.localeCompare(b))
            .flatMap((name): RuleSource[] => {
                const id = ruleIdOf(name);
                const file = join(folder, name);
                return id === null ? [] : [{ file, id, text: readFileSync(file, "utf8") }];
            });
    });
};
```
