core/coordinators/config.coordinator.ts

core/coordinators/config.coordinator.ts is a file in Bane's Lab Build Scripts. 71 lines of code and 13 definitions.

import { ROOT, absolutePath, relativePath } from "@ssot/paths";
import { basename, join } from "node:path";
import { eslintScopes, jsonSafe, neutralized } from "#core/converters/config.converter";
import { existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
import {
    govlabEslintConfig,
    govlabHtmlhintConfig,
    govlabJscpdConfig,
    govlabKnipConfig,
    govlabOxlintConfig,
    govlabPrettierConfig,
    govlabPrettierIgnore,
    govlabStylelintConfig,
} from "@govlab/quality/config";
import { CONFIG_FILE_SUFFIX } from "#configuration/constants/config.constants";
import type { ConfigExtract } from "#types/config.types";
import { isRecord } from "#core/selectors/base.selector";
import { pathToFileURL } from "node:url";
import { writeCanonicalJson } from "@govlab/canonical-write";

const POSIX_SEPARATOR = "/";

const WINDOWS_SEPARATOR = "\\";

const ROOT_TOKEN = "{root}";

const taxonomyOf = async function taxonomyOf(): Promise<unknown> {
    const loaded: unknown = await import(pathToFileURL(absolutePath("govlabHost.taxonomy")).href);
    return isRecord(loaded)
        ? { imports: loaded["imports"], layers: loaded["LAYERS"], taxonomy: loaded["taxonomy"] }
        : null;
};

const EXTRACTS: readonly ConfigExtract[] = [
    { name: "eslint", read: async (root) => eslintScopes(await govlabEslintConfig(root)) },
    { name: "oxlint", read: govlabOxlintConfig },
    { name: "stylelint", read: govlabStylelintConfig },
    {
        name: "prettier",
        read: async (root) => ({ config: await govlabPrettierConfig(root), ignore: await govlabPrettierIgnore(root) }),
    },
    { name: "htmlhint", read: govlabHtmlhintConfig },
    { name: "jscpd", read: govlabJscpdConfig },
    { name: "knip", read: govlabKnipConfig },
    { name: "taxonomy", read: taxonomyOf },
];

const pathTokens = function pathTokens(): (readonly [string, string])[] {
    const posixRoot = ROOT.split(WINDOWS_SEPARATOR).join(POSIX_SEPARATOR);
    const appRoot = relativePath("app.root");
    return [
        [ROOT, ROOT_TOKEN],
        [posixRoot, ROOT_TOKEN],
        [appRoot, `{app.root}`],
        [basename(ROOT), ROOT_TOKEN],
    ];
};

export const extractConfigs = async function extractConfigs(): Promise<number> {
    const folder = absolutePath("app.configs");
    const tokens = pathTokens();
    const files = new Map(
        await Promise.all(
            EXTRACTS.map(async (extract): Promise<[string, unknown]> => [
                extract.name + CONFIG_FILE_SUFFIX,
                neutralized(jsonSafe(await extract.read(ROOT)), tokens),
            ]),
        ),
    );
    mkdirSync(folder, { recursive: true });
    for (const name of existsSync(folder) ? readdirSync(folder) : []) {
        if (!files.has(name)) {
            rmSync(join(folder, name), { force: true, recursive: true });
        }
    }
    await Promise.all([...files].map(async ([name, data]) => writeCanonicalJson(join(folder, name), data)));
    return files.size;
};