# core/loaders/source.loader.ts

> 37 lines of code and 8 definitions.

Tree: Code Parse
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/code-parse#file-code-parse-core-loaders-source-loader-ts
Source text: https://banes-lab.com/source/code-parse/core/loaders/source.loader.ts.txt

Listed in [core/loaders](https://banes-lab.com/api/source/code-parse/core/loaders.md), after [core/loaders/manifest.loader.ts](https://banes-lab.com/source/code-parse/core/loaders/manifest.loader.ts.md).

## Definitions

- `dotted` (lexical_declaration, line 7)
- `addLanguageExtensions` (lexical_declaration, line 17)
- `loadDerivedExtensions` (lexical_declaration, line 32, exported)
- `bare` (lexical_declaration, line 8)
- `readExtensionMap` (lexical_declaration, line 12)
- `file` (lexical_declaration, line 13)
- `map` (lexical_declaration, line 33, exported)
- `parsed` (lexical_declaration, line 34, exported)

## Contained in

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

## Uses

- [core/predicates/record.predicate.ts](https://banes-lab.com/source/code-parse/core/predicates/record.predicate.ts.md)

## Linked from

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

## Source

```typescript
import { existsSync, readFileSync } from "node:fs";
import { EXTENSION_DOT } from "#configuration/constants/source.constants";
import { EXTENSION_MAP_FILE } from "#configuration/constants/grammar.constants";
import { absolutePath } from "@ssot/paths";
import { isRecord } from "#core/predicates/record.predicate";

const dotted = function dotted(fileType: string): string {
    const bare = fileType.startsWith(EXTENSION_DOT) ? fileType.slice(EXTENSION_DOT.length) : fileType;
    return `${EXTENSION_DOT}${bare.toLowerCase()}`;
};

const readExtensionMap = function readExtensionMap(): unknown {
    const file = absolutePath("govlab.utils.codeParse.generated", EXTENSION_MAP_FILE);
    return existsSync(file) ? JSON.parse(readFileSync(file, "utf8")) : null;
};

const addLanguageExtensions = function addLanguageExtensions(
    map: Map<string, string>,
    language: string,
    fileTypes: unknown,
): void {
    if (!Array.isArray(fileTypes)) {
        return;
    }
    for (const fileType of fileTypes) {
        if (typeof fileType === "string" && !map.has(dotted(fileType))) {
            map.set(dotted(fileType), language);
        }
    }
};

export const loadDerivedExtensions = function loadDerivedExtensions(): Map<string, string> {
    const map = new Map<string, string>();
    const parsed = readExtensionMap();
    if (isRecord(parsed)) {
        for (const language of Object.keys(parsed).sort((a, b) => a.localeCompare(b))) {
            addLanguageExtensions(map, language, parsed[language]);
        }
    }
    return map;
};
```
