# core/converters/page.converter.ts

> 19 lines of code and 8 definitions.

Tree: GovLab Patterns
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/patterns#file-patterns-core-converters-page-converter-ts
Source text: https://banes-lab.com/source/patterns/core/converters/page.converter.ts.txt

Listed in [core/converters](https://banes-lab.com/api/source/patterns/core/converters.md), after [core/converters/math.converter.ts](https://banes-lab.com/source/patterns/core/converters/math.converter.ts.md) and before [core/converters/report.converter.ts](https://banes-lab.com/source/patterns/core/converters/report.converter.ts.md).

## Definitions

- `planNode` (lexical_declaration, line 12, exported)
- `PATH_SEP` (lexical_declaration, line 6)
- `pageBaseName` (lexical_declaration, line 8, exported)
- `base` (lexical_declaration, line 13, exported)
- `ownFiles` (lexical_declaration, line 17, exported)
- `subDirs` (lexical_declaration, line 18, exported)
- `childCrumbs` (lexical_declaration, line 19, exported)
- `self` (lexical_declaration, line 20, exported)

## Contained in

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

## Uses

- [core/converters/folder.converter.ts](https://banes-lab.com/source/patterns/core/converters/folder.converter.ts.md)

## Linked from

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

## Source

```typescript
import type { HexPage, TreeGroup, TreeLeaf, TreeNode } from "#types/page.types";
import { INLINE_THRESHOLD, ROOT_PAGE, SLUG_JOIN } from "#configuration/constants/report.constants";
import type { Crumb } from "#types/report.types";
import { subtreeFiles } from "#core/converters/folder.converter";

const PATH_SEP = "/";

export const pageBaseName = function pageBaseName(rel: string): string {
    return rel === "" ? ROOT_PAGE : rel.split(PATH_SEP).join(SLUG_JOIN);
};

export const planNode = function planNode(node: TreeNode, crumbs: readonly Crumb[]): HexPage[] {
    const base = { crumbs: [...crumbs], label: node.name, page: pageBaseName(node.rel), rel: node.rel };
    if (node.kind === "file" || node.count <= INLINE_THRESHOLD) {
        return [{ ...base, drilled: [], inlined: subtreeFiles(node) }];
    }
    const ownFiles = node.children.filter((child): child is TreeLeaf => child.kind === "file");
    const subDirs = node.children.filter((child): child is TreeGroup => child.kind === "dir");
    const childCrumbs: Crumb[] = [...crumbs, { label: node.name, page: base.page }];
    const self: HexPage = { ...base, drilled: node.children, inlined: ownFiles.map((leaf) => leaf.entry) };
    return [self, ...subDirs.flatMap((child) => planNode(child, childCrumbs))];
};
```
