# core/loaders/tree.loader.ts

> 30 lines of code and 9 definitions.

Tree: Bane's Lab Site
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/tree#file-core-loaders-tree-loader-ts
Source text: https://banes-lab.com/source/tree/core/loaders/tree.loader.ts.txt

Listed in [core/loaders](https://banes-lab.com/api/source/tree/core/loaders.md), after [core/loaders/payload.loader.ts](https://banes-lab.com/source/tree/core/loaders/payload.loader.ts.md) and before [core/loaders/walk.loader.ts](https://banes-lab.com/source/tree/core/loaders/walk.loader.ts.md).

## Definitions

- `TreeTabModule` (interface_declaration, line 6)
- `TREE_TAB_MODULES` (lexical_declaration, line 10)
- `moduleKeyOf` (lexical_declaration, line 12)
- `TREE_TAB_HEADS` (lexical_declaration, line 16, exported)
- `loadTreeTab` (lexical_declaration, line 24, exported)
- `load` (lexical_declaration, line 25, exported)
- `[loaded]` (lexical_declaration, line 29, exported)
- `loadTreeTabs` (lexical_declaration, line 33, exported)
- `tabs` (lexical_declaration, line 34, exported)

## Contained in

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

## Source

```typescript
import { ANATOMY_CONTAINER_ICON } from "#configuration/icons/anatomy.icons";
import { ANATOMY_TREE_DECLARATIONS } from "#core/registries/anatomy.tree.registry";
import { TREE_TAB_STEM } from "#configuration/constants/anatomy.constants";
import type { Tab } from "#types/document.types";

interface TreeTabModule {
    readonly ANATOMY_TREE_TAB: readonly Tab[];
}

const TREE_TAB_MODULES = import.meta.glob<TreeTabModule>("../generated/anatomy.page.*.generated.ts");

const moduleKeyOf = function moduleKeyOf(tab: string): string {
    return `../generated/${TREE_TAB_STEM}${tab}.generated.ts`;
};

export const TREE_TAB_HEADS: readonly Tab[] = ANATOMY_TREE_DECLARATIONS.map((declaration) => ({
    icon: ANATOMY_CONTAINER_ICON,
    id: declaration.tab,
    label: declaration.label,
    layout: "tree",
    sections: [],
}));

export const loadTreeTab = async function loadTreeTab(tab: string): Promise<Tab | undefined> {
    const load = TREE_TAB_MODULES[moduleKeyOf(tab)];
    if (load === undefined) {
        return undefined;
    }
    const [loaded] = (await load()).ANATOMY_TREE_TAB;
    return loaded;
};

export const loadTreeTabs = async function loadTreeTabs(): Promise<readonly Tab[]> {
    const tabs = await Promise.all(TREE_TAB_HEADS.map(async (head) => loadTreeTab(head.id)));
    return tabs.flatMap((tab) => (tab === undefined ? [] : [tab]));
};
```
