# core/producers/reference.producer.ts

> 32 lines of code and 8 definitions.

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

Listed in [core/producers](https://banes-lab.com/api/source/build-scripts/core/producers.md), after [core/producers/page.producer.ts](https://banes-lab.com/source/build-scripts/core/producers/page.producer.ts.md) and before [core/producers/route.producer.ts](https://banes-lab.com/source/build-scripts/core/producers/route.producer.ts.md).

## Definitions

- `filesOf` (lexical_declaration, line 11)
- `roots` (lexical_declaration, line 18, exported)
- `refOf` (lexical_declaration, line 19, exported)
- `folder` (lexical_declaration, line 20, exported)
- `edges` (lexical_declaration, line 21, exported)
- `from` (lexical_declaration, line 25, exported)
- `targets` (lexical_declaration, line 26, exported)
- `to` (lexical_declaration, line 27, exported)

## Contained in

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

## Source

```typescript
import type { AnatomyFile, AnatomyFolder } from "@banes-lab/web/types/anatomy.types.js";
import { ANATOMY_PREFIX } from "#configuration/constants/graph.constants";
import type { GraphEdge } from "@banes-lab/web/types/graph.types.js";
import { REFERENCES_RELATION } from "@banes-lab/web/constants/graph.constants";
import { absolutePath } from "@ssot/paths";
import { codeTargetRefOf } from "#core/resolvers/evidence.resolver";
import { defineProducer } from "#core/factories/producer.factory";
import { join } from "node:path";
import { referenceTargetsOf } from "#core/loaders/reference.loader";

const filesOf = function filesOf(folder: AnatomyFolder): readonly AnatomyFile[] {
    return [...folder.files, ...folder.folders.flatMap(filesOf)];
};

export default defineProducer({
    name: "reference",
    produce: (context) => {
        const roots = context.trees.map((tree) => tree.snapshot.tree);
        const refOf = codeTargetRefOf(roots, context.ids);
        const folder = absolutePath("app.sources");
        const edges = roots.flatMap(filesOf).flatMap((file): readonly GraphEdge[] => {
            if (file.references === undefined) {
                return [];
            }
            const from = ANATOMY_PREFIX + context.ids.fileId(file.path);
            const targets = referenceTargetsOf(join(folder, file.references)).flatMap((target) => {
                const to = refOf(target);
                return to === null || to === from ? [] : [to];
            });
            return [...new Set(targets)].map((to) => ({ from, relation: REFERENCES_RELATION, to }));
        });
        return { edges, nodes: [] };
    },
});
```
