# core/validators/readme.validator.ts

> 49 lines of code and 6 definitions.

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

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

## Definitions

- `asDiscovered` (lexical_declaration, line 17)
- `ontologyMessages` (lexical_declaration, line 21)
- `docsMessages` (lexical_declaration, line 34)
- `governanceMessages` (lexical_declaration, line 48, exported)
- `manifestAt` (lexical_declaration, line 13)
- `at` (lexical_declaration, line 40)

## Contained in

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

## Uses

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

## Linked from

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

## Source

```typescript
import type { GovernanceEngine, ReadmeContext } from "#types/document.output.types";
import {
    conceptFinding,
    declaredDocFinding,
    docsFieldFinding,
    docsIncomplete,
    principleFinding,
} from "#configuration/strings/package.strings";
import type { DiscoveredModule } from "#types/readme.types";
import { MANIFEST_FILE } from "#configuration/constants/document.constants";
import type { ManifestModule } from "#types/manifest.types";

const manifestAt = function manifestAt(module: ManifestModule): string {
    return [module.label, MANIFEST_FILE].join("/");
};

const asDiscovered = function asDiscovered(module: ManifestModule): DiscoveredModule {
    return { axis: module.group, dir: module.dir, manifest: module.manifest, slug: module.slug };
};

const ontologyMessages = function ontologyMessages(engine: GovernanceEngine, module: ManifestModule): string[] {
    const at = manifestAt(module);
    return [
        ...engine
            .governPrinciples(module.manifest)
            .map((finding) => principleFinding(at, finding.axis, finding.detail)),
        ...engine.governConcepts(module.manifest).map((finding) => conceptFinding(at, finding.axis, finding.detail)),
        ...engine
            .governDeclaredDocs(asDiscovered(module))
            .map((finding) => declaredDocFinding(at, finding.doc, finding.heading, finding.axis, finding.detail)),
    ];
};

const docsMessages = function docsMessages(
    engine: GovernanceEngine,
    module: ManifestModule,
    context: ReadmeContext,
): string[] {
    if (module.manifest.docs !== undefined) {
        const at = manifestAt(module);
        return engine
            .governManifest(asDiscovered(module))
            .map((finding) => docsFieldFinding(at, finding.field, finding.axis, finding.detail));
    }
    return context.onDiskReadme.startsWith(context.generatedPrefix) ? [docsIncomplete(module.label)] : [];
};

export const governanceMessages = function governanceMessages(
    engine: GovernanceEngine,
    module: ManifestModule,
    context: ReadmeContext,
): string[] {
    return [...ontologyMessages(engine, module), ...docsMessages(engine, module, context)];
};
```
