# core/persistence/report.persistence.ts

> 21 lines of code and 4 definitions.

Tree: Build tree
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/build#file-build-core-persistence-report-persistence-ts
Source text: https://banes-lab.com/assets/sources/source.9d01e731a373c084be569c7cff7022fd362da3f5af995fb56ccff237a46e33a5.generated.txt

## Definitions

- `persistJson` (lexical_declaration, line 10, exported)
- `ensureFolder` (lexical_declaration, line 6)
- `persistText` (lexical_declaration, line 15, exported)
- `readJsonOrNull` (lexical_declaration, line 20, exported)

## Used by

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

## Source

```typescript
import { existsSync, mkdirSync, readFileSync } from "node:fs";
import { writeCanonicalJson, writeCanonicalText } from "@govlab/canonical-write";
import { UTF8 } from "#configuration/constants/source.constants";
import { dirname } from "node:path";

const ensureFolder = function ensureFolder(target: string): void {
    mkdirSync(dirname(target), { recursive: true });
};

export const persistJson = async function persistJson(target: string, data: unknown): Promise<void> {
    ensureFolder(target);
    await writeCanonicalJson(target, data);
};

export const persistText = async function persistText(target: string, text: string): Promise<void> {
    ensureFolder(target);
    await writeCanonicalText(target, text);
};

export const readJsonOrNull = function readJsonOrNull(target: string): unknown {
    if (!existsSync(target)) {
        return null;
    }
    return JSON.parse(readFileSync(target, UTF8));
};
```
