# core/selectors/document.selector.ts

> 17 lines of code and 5 definitions.

Tree: GovLab Stats
Language: typescript
Layer: application
Canonical: https://banes-lab.com/anatomy/stats#file-stats-core-selectors-document-selector-ts
Source text: https://banes-lab.com/source/stats/core/selectors/document.selector.ts.txt

Listed in [core/selectors](https://banes-lab.com/api/source/stats/core/selectors.md), before [core/selectors/field.selector.ts](https://banes-lab.com/source/stats/core/selectors/field.selector.ts.md).

## Definitions

- `frontmatterValue` (lexical_declaration, line 4, exported)
- `end` (lexical_declaration, line 8, exported)
- `block` (lexical_declaration, line 9, exported)
- `needle` (lexical_declaration, line 10, exported)
- `trimmed` (lexical_declaration, line 12, exported)

## Contained in

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

## Used by

- [core/loaders/agent.loader.ts](https://banes-lab.com/source/stats/core/loaders/agent.loader.ts.md)
- [core/loaders/document.loader.ts](https://banes-lab.com/source/stats/core/loaders/document.loader.ts.md)

## Linked from

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

## Source

```typescript
import { FRONTMATTER_FENCE } from "#configuration/constants/document.constants";
import { LINE_BREAK } from "#configuration/constants/source.constants";

export const frontmatterValue = function frontmatterValue(text: string, key: string): string | null {
    if (!text.startsWith(FRONTMATTER_FENCE)) {
        return null;
    }
    const end = text.indexOf(`${LINE_BREAK}${FRONTMATTER_FENCE}`, FRONTMATTER_FENCE.length);
    const block = end === -1 ? text : text.slice(0, end);
    const needle = `${key}:`;
    for (const line of block.split(LINE_BREAK)) {
        const trimmed = line.trim();
        if (trimmed.startsWith(needle)) {
            return trimmed.slice(needle.length).trim();
        }
    }
    return null;
};
```
