# core/caches/report.cache.ts

> 20 lines of code and 6 definitions.

Tree: GovLab Patterns
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/patterns#file-patterns-core-caches-report-cache-ts
Source text: https://banes-lab.com/source/patterns/core/caches/report.cache.ts.txt

Listed in [core/caches](https://banes-lab.com/api/source/patterns/core/caches.md).

## Definitions

- `hexArtifactsExist` (lexical_declaration, line 22, exported)
- `PART_JOIN` (lexical_declaration, line 6)
- `openReportCache` (lexical_declaration, line 8, exported)
- `moduleFingerprint` (lexical_declaration, line 12, exported)
- `fan` (lexical_declaration, line 17, exported)
- `cyc` (lexical_declaration, line 18, exported)

## Contained in

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

## Uses

- [core/loaders/finding.loader.ts](https://banes-lab.com/source/patterns/core/loaders/finding.loader.ts.md)

## Used by

- [runtime/entrypoints/report.entrypoint.ts](https://banes-lab.com/source/patterns/runtime/entrypoints/report.entrypoint.ts.md)

## Linked from

- [core/loaders](https://banes-lab.com/anatomy/patterns/folder-patterns-core-loaders.md)
- [runtime/entrypoints](https://banes-lab.com/anatomy/patterns/folder-patterns-runtime-entrypoints.md)

## Source

```typescript
import { cacheFile, createFingerprintIndex, fingerprint, fingerprintOf } from "@govlab/content-fingerprint";
import { CACHE_NAME } from "#configuration/constants/report.constants";
import { existsSync } from "node:fs";
import { findingsPathOf } from "#core/loaders/finding.loader";

const PART_JOIN = ";";

export const openReportCache = function openReportCache(force: boolean): ReturnType<typeof createFingerprintIndex> {
    return createFingerprintIndex({ file: cacheFile(CACHE_NAME), force });
};

export const moduleFingerprint = function moduleFingerprint(
    files: readonly string[],
    fanIn: readonly [string, number][],
    cycles: readonly unknown[],
): string {
    const fan = fanIn.map(([key, count]) => `${key}=${count}`).sort((a, b) => a.localeCompare(b));
    const cyc = cycles.map((finding) => JSON.stringify(finding)).sort((a, b) => a.localeCompare(b));
    return fingerprintOf([fingerprint([...files]), fan.join(PART_JOIN), cyc.join(PART_JOIN)]);
};

export const hexArtifactsExist = function hexArtifactsExist(moduleDir: string): boolean {
    return existsSync(findingsPathOf(moduleDir));
};
```
