# core/persistence/asset.persistence.ts

> 28 lines of code and 5 definitions.

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

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

## Definitions

- `replaceFolderFiles` (lexical_declaration, line 6, exported)
- `pruneOutput` (lexical_declaration, line 21, exported)
- `unreferenced` (lexical_declaration, line 22, exported)
- `bytes` (lexical_declaration, line 23, exported)
- `target` (lexical_declaration, line 25, exported)

## Contained in

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

## Used by

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

## Linked from

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

## Source

```typescript
import { join, resolve } from "node:path";
import { mkdirSync, readdirSync, rmSync, statSync } from "node:fs";
import { unreferencedFiles } from "#core/analyzers/asset.analyzer";
import { writeVerbatim } from "@govlab/canonical-write";

export const replaceFolderFiles = function replaceFolderFiles(
    folder: string,
    files: ReadonlyMap<string, string>,
): void {
    mkdirSync(folder, { recursive: true });
    for (const name of readdirSync(folder)) {
        if (!files.has(name)) {
            rmSync(join(folder, name), { force: true, recursive: true });
        }
    }
    for (const [name, content] of files) {
        writeVerbatim(join(folder, name), content);
    }
};

export const pruneOutput = function pruneOutput(outDir: string): { count: number; bytes: number } {
    const unreferenced = unreferencedFiles(outDir);
    let bytes = 0;
    for (const file of unreferenced) {
        const target = resolve(outDir, file);
        bytes += statSync(target).size;
        rmSync(target, { force: true });
    }
    return { bytes, count: unreferenced.length };
};
```
