# core/loaders/reference.loader.ts

> 19 lines of code and 6 definitions.

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

Listed in [core/loaders](https://banes-lab.com/api/source/build-scripts/core/loaders.md), after [core/loaders/metric.loader.ts](https://banes-lab.com/source/build-scripts/core/loaders/metric.loader.ts.md) and before [core/loaders/search.loader.ts](https://banes-lab.com/source/build-scripts/core/loaders/search.loader.ts.md).

## Definitions

- `targetsIn` (lexical_declaration, line 7)
- `referenceTargetsOf` (lexical_declaration, line 11, exported)
- `CHANNELS` (lexical_declaration, line 5)
- `parsed` (lexical_declaration, line 15, exported)
- `listed` (lexical_declaration, line 19, exported)
- `bound` (lexical_declaration, line 20, exported)

## Contained in

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

## Linked from

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

## Source

```typescript
import { existsSync, readFileSync } from "node:fs";
import type { CodeTarget } from "@banes-lab/web/types/code.types.js";
import { isRecord } from "#core/selectors/base.selector";

const CHANNELS = ["spans", "strings", "words"] as const;

const targetsIn = function targetsIn(value: unknown): readonly CodeTarget[] {
    return isRecord(value) ? Object.values(value).filter((target): target is CodeTarget => isRecord(target)) : [];
};

export const referenceTargetsOf = function referenceTargetsOf(file: string): readonly CodeTarget[] {
    if (!existsSync(file)) {
        return [];
    }
    const parsed: unknown = JSON.parse(readFileSync(file, "utf8"));
    if (!isRecord(parsed)) {
        return [];
    }
    const listed = parsed["targets"];
    const bound = Array.isArray(listed) ? listed.filter((target): target is CodeTarget => isRecord(target)) : [];
    return [...CHANNELS.flatMap((channel) => targetsIn(parsed[channel])), ...bound];
};
```
