core/normalizers/architecture.normalizer.ts

core/normalizers/architecture.normalizer.ts is a file in GovLab Context. 52 lines of code and 10 definitions.

import { ARCH_SCHEMA, PRINCIPLE_KIND } from "#configuration/schemas/architecture.schema";
import { ARCH_SUBJECT, SEVERITY_LEVEL_VALUES } from "#configuration/constants/architecture.constants";
import { asCheck, mergeCheck } from "#core/converters/check.converter";
import { asClosed, asDistinctFrom, asExemplar, asString, asStringArray } from "#core/normalizers/field.normalizer";
import type { CheckFacet } from "#types/check.types";
import type { Principle } from "#types/architecture.types";
import { refuseRecord } from "#core/validators/field.validator";
import { severityOf } from "#configuration/strings/architecture.strings";
import { slugify } from "#core/converters/identifier.converter";

export const normalizePrinciple = function normalizePrinciple(
    raw: Record<string, unknown>,
    category: string,
    declared: CheckFacet | null,
): Principle {
    refuseRecord(ARCH_SUBJECT, PRINCIPLE_KIND, ARCH_SCHEMA, raw);
    const name = asString(raw["name"]);
    const exemplar = asExemplar(raw["exemplar"]);
    const mandatoryFor = asString(raw["mandatoryFor"]);
    const check = mergeCheck(declared, asCheck(raw["check"]));
    const canon = asStringArray(raw["canon"]);
    const distinctFrom = asDistinctFrom(raw["distinctFrom"]);
    const expressedBy = asStringArray(raw["expressedBy"]);
    const formedBy = asString(raw["formed_by"]);
    const violatedBy = asStringArray(raw["violated_by"]);
    return {
        aliases: asStringArray(raw["aliases"]),
        category,
        conflicts_with: asStringArray(raw["conflicts_with"]),
        definition: asString(raw["definition"]),
        detected_by: asStringArray(raw["detected_by"]),
        enables: asStringArray(raw["enables"]),
        enforced_by: asStringArray(raw["enforced_by"]),
        id: asString(raw["id"]) || slugify(name),
        measured_by: asStringArray(raw["measured_by"]),
        name,
        refactored_by: asStringArray(raw["refactored_by"]),
        reinforces: asStringArray(raw["reinforces"]),
        requires: asStringArray(raw["requires"]),
        scope: asStringArray(raw["scope"]),
        severity: asClosed(SEVERITY_LEVEL_VALUES, raw["severity"], severityOf(name)),
        tensions_with: asStringArray(raw["tensions_with"]),
        type: asString(raw["type"]),
        ...(violatedBy.length > 0 ? { violated_by: violatedBy } : {}),
        ...(formedBy ? { formed_by: formedBy } : {}),
        ...(canon.length > 0 ? { canon } : {}),
        ...(check ? { check } : {}),
        ...(distinctFrom.length > 0 ? { distinctFrom } : {}),
        ...(exemplar ? { exemplar } : {}),
        ...(expressedBy.length > 0 ? { expressedBy } : {}),
        ...(mandatoryFor ? { mandatoryFor } : {}),
    };
};