tools/core/validators/verdict.validator.ts
tools/core/validators/verdict.validator.ts is a file in Coordination Surface. 71 lines of code and 15 definitions.
import { MIDDLE_TIERS } from "../constants/verdict.constants.ts";
import { RULE_ROOT } from "../constants/layer.constants.ts";
import { isWordCharacter } from "../predicates/token.predicate.ts";
import { localImports } from "../analyzers/graph.analyzer.ts";
import { stringLiterals } from "../predicates/literal.predicate.ts";
interface Tier {
readonly tier: string;
readonly line: number;
}
const isUpper = function isUpper(char: string): boolean {
return char >= "A" && char <= "Z";
};
const isAllUpper = function isAllUpper(word: string): boolean {
for (const char of word) {
if (!isUpper(char)) {
return false;
}
}
return true;
};
const declaresTier = function declaresTier(source: string): boolean {
return stringLiterals(source).some((literal) => MIDDLE_TIERS.includes(literal.value.toLowerCase()));
};
const claimedByRule = function claimedByRule(
path: string,
paths: readonly string[],
read: (path: string) => string,
known: ReadonlySet<string>,
): boolean {
return paths
.filter((consumer) => consumer.startsWith(RULE_ROOT))
.some((consumer) => localImports(consumer, read(consumer), known).includes(path));
};
export const escapedVocabulary = function escapedVocabulary(
paths: readonly string[],
read: (path: string) => string,
exemption: readonly string[],
): string[] {
const known = new Set(paths);
return paths
.filter((path) => exemption.some((root) => path.startsWith(root)))
.filter((path) => declaresTier(read(path)))
.filter((path) => !claimedByRule(path, paths, read, known));
};
const wordEnd = function wordEnd(source: string, from: number): number {
let end = from;
while (end < source.length && isWordCharacter(source.charAt(end))) {
end += 1;
}
return end;
};
export const declaredTiers = function declaredTiers(source: string): Tier[] {
const out: Tier[] = [];
let line = 1;
let index = 0;
while (index < source.length) {
const char = source.charAt(index);
if (isWordCharacter(char)) {
const end = wordEnd(source, index);
const word = source.slice(index, end);
if (isAllUpper(word) && MIDDLE_TIERS.includes(word.toLowerCase())) {
out.push({ line, tier: word.toLowerCase() });
}
index = end;
} else {
line += char === "\n" ? 1 : 0;
index += 1;
}
}
return out;
};