# core/persistence/graph.persistence.ts

> 32 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-persistence-graph-persistence-ts
Source text: https://banes-lab.com/source/build-scripts/core/persistence/graph.persistence.ts.txt

Listed in [core/persistence](https://banes-lab.com/api/source/build-scripts/core/persistence.md), after [core/persistence/folder.persistence.ts](https://banes-lab.com/source/build-scripts/core/persistence/folder.persistence.ts.md) and before [core/persistence/icons.persistence.ts](https://banes-lab.com/source/build-scripts/core/persistence/icons.persistence.ts.md).

## Definitions

- `writeGraphChunks` (lexical_declaration, line 19, exported)
- `writeGraphReport` (lexical_declaration, line 14, exported)
- `JSON_INDENT` (lexical_declaration, line 12)
- `folder` (lexical_declaration, line 23, exported)
- `written` (lexical_declaration, line 24, exported)
- `keys` (lexical_declaration, line 28, exported)

## Contained in

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

## Uses

- [core/formatters/graph.formatter.ts](https://banes-lab.com/source/build-scripts/core/formatters/graph.formatter.ts.md)
- [core/predicates/graph.predicate.ts](https://banes-lab.com/source/build-scripts/core/predicates/graph.predicate.ts.md)
- [core/resolvers/catalog.resolver.ts](https://banes-lab.com/source/build-scripts/core/resolvers/catalog.resolver.ts.md)
- [core/resolvers/graph.resolver.ts](https://banes-lab.com/source/build-scripts/core/resolvers/graph.resolver.ts.md)

## Used by

- [core/coordinators/graph.coordinator.ts](https://banes-lab.com/source/build-scripts/core/coordinators/graph.coordinator.ts.md)

## Linked from

- [core/coordinators](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-coordinators.md)
- [core/formatters](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-formatters.md)
- [core/predicates](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-predicates.md)
- [core/resolvers](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-resolvers.md)

## Source

```typescript
import { dirname, join } from "node:path";
import { mkdirSync, readdirSync, rmSync } from "node:fs";
import { renderGraphChunk, renderGraphLoader } from "#core/formatters/graph.formatter";
import { writeCanonicalText, writeVerbatim } from "@govlab/canonical-write";
import type { GraphChunk } from "@banes-lab/web/types/graph.types.js";
import type { GraphReport } from "#types/graph.types";
import { absolutePath } from "@ssot/paths";
import { chunkFileOf } from "#core/resolvers/graph.resolver";
import { graphReport } from "#core/resolvers/catalog.resolver";
import { isChunkFile } from "#core/predicates/graph.predicate";

const JSON_INDENT = 4;

export const writeGraphReport = function writeGraphReport(report: GraphReport, file = graphReport()): void {
    mkdirSync(dirname(file), { recursive: true });
    writeVerbatim(file, JSON.stringify(report, null, JSON_INDENT));
};

export const writeGraphChunks = async function writeGraphChunks(
    chunks: ReadonlyMap<string, GraphChunk>,
    loader = absolutePath("app.graph"),
): Promise<void> {
    const folder = dirname(loader);
    const written = new Set([...chunks.keys()].map(chunkFileOf));
    for (const stale of readdirSync(folder).filter((name) => isChunkFile(name) && !written.has(name))) {
        rmSync(join(folder, stale));
    }
    const keys = [...chunks.keys()];
    await Promise.all([
        writeCanonicalText(loader, renderGraphLoader(keys)),
        ...[...chunks].map(async ([collection, chunk]) =>
            writeCanonicalText(join(folder, chunkFileOf(collection)), renderGraphChunk(chunk)),
        ),
    ]);
};
```
