core/loaders/ontology.loader.ts
core/loaders/ontology.loader.ts is a file in GovLab Context. 48 lines of code and 7 definitions.
import {
CATEGORIES_SOURCE,
CATEGORY_KEY,
CHECK_KEY,
JSON_EXTENSION,
RECORDS_KEY,
} from "#configuration/constants/ontology.constants";
import type { JsonDirOptions, Normalizer } from "#types/ontology.types";
import { readFileSync, readdirSync } from "node:fs";
import type { ReadAudit } from "#core/observers/record.observer";
import { asCheck } from "#core/converters/check.converter";
import { join } from "node:path";
export const readJsonFile = function readJsonFile(file: string): unknown {
return JSON.parse(readFileSync(file, "utf8"));
};
export const readJsonDir = function readJsonDir(dir: string, options: JsonDirOptions = {}): unknown[] {
return readdirSync(dir)
.filter((name) => name.endsWith(JSON_EXTENSION))
.filter((name) => (options.only ? options.only(name) : true))
.filter((name) => (options.exclude ? !options.exclude(name) : true))
.toSorted((a, b) => a.localeCompare(b))
.map((name) => readJsonFile(join(dir, name)));
};
const foldGroup = function foldGroup<R>(
group: Record<string, unknown>,
normalize: Normalizer<R>,
audit: ReadAudit,
): R[] {
const category = typeof group[CATEGORY_KEY] === "string" ? group[CATEGORY_KEY] : "";
const declared = asCheck(group[CHECK_KEY]);
audit.attribution(group);
return audit.records(group[RECORDS_KEY], category).map((record) => normalize(record, category, declared, group));
};
export const foldCategories = function foldCategories<R>(
categories: unknown[],
normalize: Normalizer<R>,
audit: ReadAudit,
): R[] {
return audit.records(categories, CATEGORIES_SOURCE).flatMap((group) => foldGroup(group, normalize, audit));
};
export const loadCategories = function loadCategories<R>(
dir: string,
normalize: Normalizer<R>,
audit: ReadAudit,
options: JsonDirOptions = {},
): R[] {
return foldCategories(readJsonDir(dir, options), normalize, audit);
};