# core/predicates/document.predicate.ts

> 37 lines of code and 9 definitions.

Tree: GovLab Docs
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-predicates-document-predicate-ts
Source text: https://banes-lab.com/source/docs/core/predicates/document.predicate.ts.txt

Listed in [core/predicates](https://banes-lab.com/api/source/docs/core/predicates.md), after [core/predicates/code.typescript.predicate.ts](https://banes-lab.com/source/docs/core/predicates/code.typescript.predicate.ts.md) and before [core/predicates/program.predicate.ts](https://banes-lab.com/source/docs/core/predicates/program.predicate.ts.md).

## Definitions

- `isGeneratedDoc` (lexical_declaration, line 40, exported)
- `isBoundaryFilename` (lexical_declaration, line 12, exported)
- `isHarnessOwned` (lexical_declaration, line 19, exported)
- `isHostBoundary` (lexical_declaration, line 23, exported)
- `scanLimit` (lexical_declaration, line 27)
- `close` (lexical_declaration, line 31)
- `hasGeneratedMark` (lexical_declaration, line 35)
- `lower` (lexical_declaration, line 36)
- `lines` (lexical_declaration, line 41, exported)

## Contained in

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

## Used by

- [core/analyzers/document.analyzer.ts](https://banes-lab.com/source/docs/core/analyzers/document.analyzer.ts.md)
- [core/coordinators/markdown.coordinator.ts](https://banes-lab.com/source/docs/core/coordinators/markdown.coordinator.ts.md)
- [core/coordinators/validation.coordinator.ts](https://banes-lab.com/source/docs/core/coordinators/validation.coordinator.ts.md)
- [core/validators/location.validator.ts](https://banes-lab.com/source/docs/core/validators/location.validator.ts.md)

## Linked from

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

## Source

```typescript
import {
    DOC_BOUNDARY_FILENAMES,
    FRONTMATTER_FENCE,
    GENERATED_DOC_MARKS,
    GENERATED_SCAN_CLOSE_OFFSET,
    GENERATED_SCAN_LINES,
    HOW_TO_PREFIX,
    INSTALL_ARTIFACT_SUFFIX,
    MARKDOWN_SUFFIX,
} from "#configuration/constants/document.constants";

export const isBoundaryFilename = function isBoundaryFilename(filename: string): boolean {
    if (DOC_BOUNDARY_FILENAMES.includes(filename)) {
        return true;
    }
    return filename.startsWith(HOW_TO_PREFIX) && filename.endsWith(MARKDOWN_SUFFIX);
};

export const isHarnessOwned = function isHarnessOwned(relDoc: string, harnessRoot: string | null): boolean {
    return harnessRoot !== null && relDoc.startsWith(harnessRoot);
};

export const isHostBoundary = function isHostBoundary(filename: string, boundaryDocs: ReadonlySet<string>): boolean {
    return boundaryDocs.has(filename) || filename.endsWith(INSTALL_ARTIFACT_SUFFIX);
};

const scanLimit = function scanLimit(lines: readonly string[]): number {
    if (lines[0] !== FRONTMATTER_FENCE) {
        return GENERATED_SCAN_LINES;
    }
    const close = lines.indexOf(FRONTMATTER_FENCE, 1);
    return close === -1 ? GENERATED_SCAN_LINES : close + GENERATED_SCAN_CLOSE_OFFSET;
};

const hasGeneratedMark = function hasGeneratedMark(line: string): boolean {
    const lower = line.toLowerCase();
    return GENERATED_DOC_MARKS.some((mark) => lower.includes(mark));
};

export const isGeneratedDoc = function isGeneratedDoc(source: string): boolean {
    const lines = source.split("\n");
    return lines.slice(0, Math.min(lines.length, scanLimit(lines))).some(hasGeneratedMark);
};
```
