core/validators/governance.validator.ts
core/validators/governance.validator.ts is a file in GovLab Docs. 47 lines of code and 8 definitions.
import type { ArchPort, ConceptRecord, Manifest, OntologyFinding } from "#types/readme.types";
import {
ambiguousPrinciple,
conflictingPrinciples,
unresolvedConcept,
unresolvedPrinciple,
} from "#configuration/strings/governance.strings";
const conflictIds = function conflictIds(id: string, arch: ArchPort, declared: ReadonlySet<string>): string[] {
return arch
.resolve([id])
.edges.conflictsWith.flatMap((edge) => (typeof edge === "string" ? [] : [edge.id]))
.filter((other) => other !== id && declared.has(other));
};
const principleFindings = function principleFindings(
id: string,
arch: ArchPort,
declared: ReadonlySet<string>,
): OntologyFinding[] {
if ((arch.get(id) ?? null) === null) {
return [{ axis: "unresolved-principle", detail: unresolvedPrinciple(id) }];
}
return conflictIds(id, arch, declared).map((other) => ({
axis: "conflicting-principles",
detail: conflictingPrinciples(id, other),
}));
};
export const governPrinciples = function governPrinciples(manifest: Manifest, arch: ArchPort): OntologyFinding[] {
const principles = manifest.governance?.principles;
const ids = Array.isArray(principles) ? principles : [];
const declared = new Set(ids);
return ids.flatMap((id) => principleFindings(id, arch, declared));
};
export const ontologyDuplicateFindings = function ontologyDuplicateFindings(arch: ArchPort): string[] {
return arch.validateOntology().duplicateIds.map(ambiguousPrinciple);
};
export const governConcepts = function governConcepts(
manifest: Manifest,
concepts: ReadonlyMap<string, ConceptRecord>,
): OntologyFinding[] {
const ids = Array.isArray(manifest.governedBy) ? manifest.governedBy : [];
if (concepts.size === 0) {
return [];
}
return ids
.filter((id) => !concepts.has(id))
.map((id) => ({ axis: "unresolved-concept", detail: unresolvedConcept(id) }));
};