core/loaders/emitter.loader.ts

core/loaders/emitter.loader.ts is a file in GovLab Quality. 34 lines of code and 11 definitions.

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