# core/loaders/link.loader.ts

> 22 lines of code and 5 definitions.

Tree: Build tree
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/build#file-build-core-loaders-link-loader-ts
Source text: https://banes-lab.com/assets/sources/source.5a89d28e63bfd07f57c2f20750537b5d0ca67ae8b03e8e5519962598876920c4.generated.txt

## Definitions

- `isLinkSet` (lexical_declaration, line 5)
- `linkTarget` (lexical_declaration, line 15, exported)
- `linkSetOf` (lexical_declaration, line 24, exported)
- `readLinkSet` (lexical_declaration, line 19, exported)
- `parsed` (lexical_declaration, line 20, exported)

## Used by

- [runtime/entrypoints/link.entrypoint.ts](https://banes-lab.com/source/build/runtime/entrypoints/link.entrypoint.ts.md)

## Source

```typescript
import type { LinkSet, PageSection } from "#types/writing.types";
import { absolutePath } from "@ssot/paths";
import { readJsonOrNull } from "#core/persistence/report.persistence";

const isLinkSet = function isLinkSet(value: unknown): value is LinkSet {
    return (
        typeof value === "object" &&
        value !== null &&
        Object.values(value).every(
            (links: unknown) => Array.isArray(links) && links.every((link: unknown) => typeof link === "string"),
        )
    );
};

export const linkTarget = function linkTarget(): string {
    return absolutePath("govlabHost.reports.content.linkSet");
};

export const readLinkSet = function readLinkSet(): LinkSet | null {
    const parsed = readJsonOrNull(linkTarget());
    return isLinkSet(parsed) ? parsed : null;
};

export const linkSetOf = function linkSetOf(sections: readonly PageSection[]): LinkSet {
    return Object.fromEntries(sections.map((section) => [section.key, section.links]));
};
```
