core/validators/filename.validator.ts
core/validators/filename.validator.ts is a file in GovLab Docs. 34 lines of code and 9 definitions.
import type { DirectiveSubject, DocNameDefect, DocNameInput } from "#types/document.types";
import { missingConcernVerb, missingSubject, nonActivityConcern } from "#configuration/strings/document.strings";
const VERB_JOIN = "-";
const ELLIPSIS = "…";
const directiveCheck = function directiveCheck(input: DocNameInput): DirectiveSubject {
const verb = input.activityVerbs[input.concern];
if (typeof verb !== "string") {
return {
defects: [{ code: "non-activity-concern", detail: nonActivityConcern(input.form.id, input.concern) }],
subject: "",
};
}
const verbSegment = `${verb}${VERB_JOIN}`;
if (!input.name.startsWith(verbSegment)) {
const detail = missingConcernVerb(input.name, verbSegment, input.concern, verb);
return {
defects: [{ code: "missing-concern-verb", detail, expected: `${verbSegment}${ELLIPSIS}` }],
subject: "",
};
}
return { defects: [], subject: input.name.slice(verbSegment.length) };
};
export const docName = function docName(input: DocNameInput): DocNameDefect[] {
const { form } = input;
if (form.kind !== "authored" || form.boundary || typeof form.mood !== "string") {
return [];
}
const checked: DirectiveSubject =
form.mood === "directive" ? directiveCheck(input) : { defects: [], subject: input.name };
if (checked.defects.length > 0) {
return checked.defects;
}
return checked.subject.length === 0 ? [{ code: "missing-subject", detail: missingSubject(input.name) }] : [];
};