core/validators/check.validator.ts
core/validators/check.validator.ts is a file in GovLab Context. 48 lines of code and 12 definitions.
import type { CheckDeclarationDefect, DeclarationField, DeclaredCheck } from "#types/check.types";
import { DECLARATION_FIELDS, INVARIANT_KIND, RECORD_KEY_SEPARATOR } from "#configuration/constants/check.constants";
import { COLLECTIONS } from "#configuration/constants/ontology.constants";
import type { Faces } from "#types/context.types";
import { NEGATIVE_KIND } from "#configuration/constants/architecture.constants";
import { collectionRefResolver } from "#core/resolvers/reference.resolver";
const ARCH_PREFIX = `${COLLECTIONS.architecture}${RECORD_KEY_SEPARATOR}`;
const LEX_PREFIX = `${COLLECTIONS.lexicon}${RECORD_KEY_SEPARATOR}`;
const INVARIANT_PREFIX = `${COLLECTIONS.reasoning}${RECORD_KEY_SEPARATOR}${INVARIANT_KIND}${RECORD_KEY_SEPARATOR}`;
const isAntiPattern = function isAntiPattern(faces: Faces, ref: string): boolean {
return ref.startsWith(ARCH_PREFIX) && faces.arch.get(ref.slice(ARCH_PREFIX.length))?.type === NEGATIVE_KIND;
};
const isPositive = function isPositive(faces: Faces, ref: string): boolean {
if (ref.startsWith(ARCH_PREFIX)) {
const record = faces.arch.get(ref.slice(ARCH_PREFIX.length)) ?? null;
return record !== null && record.type !== NEGATIVE_KIND;
}
return ref.startsWith(LEX_PREFIX) || ref.startsWith(INVARIANT_PREFIX);
};
const OF_KIND: Readonly<Record<DeclarationField, (faces: Faces, ref: string) => boolean>> = {
detects: isAntiPattern,
enforces: isPositive,
};
export const checkDeclarationDefectsOf = function checkDeclarationDefectsOf(
faces: Faces,
checks: readonly DeclaredCheck[],
): CheckDeclarationDefect[] {
const resolves = collectionRefResolver(faces);
return checks.flatMap((declared) =>
DECLARATION_FIELDS.flatMap((field) =>
declared[field].flatMap((ref) => {
const resolved = resolves(ref);
return resolved && OF_KIND[field](faces, ref) ? [] : [{ check: declared.check, field, ref, resolved }];
}),
),
);
};
export const declaringChecksOf = function declaringChecksOf(
checks: readonly DeclaredCheck[],
): ReadonlyMap<string, readonly string[]> {
const declaring = new Map<string, string[]>();
for (const declared of checks) {
for (const ref of DECLARATION_FIELDS.flatMap((field) => declared[field])) {
declaring.set(ref, [...(declaring.get(ref) ?? []), declared.check]);
}
}
return declaring;
};