# core/persistence/document.persistence.ts

> 41 lines of code and 8 definitions.

Tree: GovLab Docs
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-persistence-document-persistence-ts
Source text: https://banes-lab.com/source/docs/core/persistence/document.persistence.ts.txt

Listed in [core/persistence](https://banes-lab.com/api/source/docs/core/persistence.md), after [core/persistence/catalog.persistence.ts](https://banes-lab.com/source/docs/core/persistence/catalog.persistence.ts.md).

## Definitions

- `healFile` (lexical_declaration, line 31, exported)
- `persistWorkspaceMap` (lexical_declaration, line 44, exported)
- `writeHardened` (lexical_declaration, line 11)
- `healMarkdown` (lexical_declaration, line 40, exported)
- `persistSpec` (lexical_declaration, line 20, exported)
- `LINE_BREAK` (lexical_declaration, line 9)
- `hits` (lexical_declaration, line 12)
- `detail` (lexical_declaration, line 14)

## Contained in

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

## Uses

- [configuration/strings/diagram.strings.ts](https://banes-lab.com/source/docs/configuration/strings/diagram.strings.ts.md)
- [core/loaders/base.loader.ts](https://banes-lab.com/source/docs/core/loaders/base.loader.ts.md)

## Used by

- [core/coordinators/document.coordinator.ts](https://banes-lab.com/source/docs/core/coordinators/document.coordinator.ts.md)
- [core/persistence/catalog.persistence.ts](https://banes-lab.com/source/docs/core/persistence/catalog.persistence.ts.md)

## Linked from

- [configuration/strings](https://banes-lab.com/anatomy/docs/folder-docs-configuration-strings.md)
- [core/coordinators](https://banes-lab.com/anatomy/docs/folder-docs-core-coordinators.md)
- [core/loaders](https://banes-lab.com/anatomy/docs/folder-docs-core-loaders.md)
- [core/persistence](https://banes-lab.com/anatomy/docs/folder-docs-core-persistence.md)

## Source

```typescript
import type { Spec, WorkspaceMap } from "#types/document.output.types";
import { hardeningAbort, hardeningLine } from "#configuration/strings/diagram.strings";
import { stampGenerated, writeVerbatim } from "@govlab/canonical-write";
import { dirname } from "node:path";
import { mermaidHardening } from "#core/analyzers/diagram.analyzer";
import { mkdirSync } from "node:fs";
import { readTextSafe } from "#core/loaders/base.loader";

const LINE_BREAK = "\n";

const writeHardened = function writeHardened(path: string, content: string): void {
    const hits = mermaidHardening(content);
    if (hits.length > 0) {
        const detail = hits.map((hit) => hardeningLine(hit.line, hit.code, hit.detail)).join(LINE_BREAK);
        throw new Error(hardeningAbort(path, detail));
    }
    writeVerbatim(path, content);
};

export const persistSpec = function persistSpec(spec: Spec, content: string): void {
    if (spec.mkdir === true) {
        mkdirSync(dirname(spec.path), { recursive: true });
    }
    if (spec.harden === true) {
        writeHardened(spec.path, content);
        return;
    }
    writeVerbatim(spec.path, content);
};

export const healFile = function healFile(target: string, content: string): boolean {
    if ((readTextSafe(target) ?? "") === content) {
        return false;
    }
    mkdirSync(dirname(target), { recursive: true });
    writeVerbatim(target, content);
    return true;
};

export const healMarkdown = function healMarkdown(target: string, body: string): boolean {
    return healFile(target, stampGenerated(body, readTextSafe(target) ?? "", new Date()));
};

export const persistWorkspaceMap = function persistWorkspaceMap(map: WorkspaceMap): void {
    mkdirSync(dirname(map.path), { recursive: true });
    writeVerbatim(map.path, map.content);
};
```
