# core/validators/filename.validator.ts

> 34 lines of code and 9 definitions.

Tree: GovLab Docs
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-validators-filename-validator-ts
Source text: https://banes-lab.com/source/docs/core/validators/filename.validator.ts.txt

Listed in [core/validators](https://banes-lab.com/api/source/docs/core/validators.md), after [core/validators/figure.validator.ts](https://banes-lab.com/source/docs/core/validators/figure.validator.ts.md) and before [core/validators/governance.validator.ts](https://banes-lab.com/source/docs/core/validators/governance.validator.ts.md).

## Definitions

- `directiveCheck` (lexical_declaration, line 7)
- `docName` (lexical_declaration, line 26, exported)
- `VERB_JOIN` (lexical_declaration, line 4)
- `ELLIPSIS` (lexical_declaration, line 5)
- `verb` (lexical_declaration, line 8)
- `verbSegment` (lexical_declaration, line 15)
- `detail` (lexical_declaration, line 17)
- `{ form }` (lexical_declaration, line 27, exported)
- `checked` (lexical_declaration, line 31, exported)

## Contained in

- [core/validators](https://banes-lab.com/anatomy/docs/folder-docs-core-validators.md)

## Uses

- [configuration/strings/document.strings.ts](https://banes-lab.com/source/docs/configuration/strings/document.strings.ts.md)

## Linked from

- [configuration/strings](https://banes-lab.com/anatomy/docs/folder-docs-configuration-strings.md)

## Source

```typescript
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) }] : [];
};
```
