core/loaders/source.loader.ts

core/loaders/source.loader.ts is a file in Code Parse. 37 lines of code and 8 definitions.

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;
};