# core/loaders/layer.loader.ts

> 25 lines of code and 3 definitions.

Tree: GovLab Context
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/context#file-context-core-loaders-layer-loader-ts
Source text: https://banes-lab.com/source/context/core/loaders/layer.loader.ts.txt

Listed in [core/loaders](https://banes-lab.com/api/source/context/core/loaders.md), after [core/loaders/grammar.loader.ts](https://banes-lab.com/source/context/core/loaders/grammar.loader.ts.md) and before [core/loaders/lexicon.loader.ts](https://banes-lab.com/source/context/core/loaders/lexicon.loader.ts.md).

## Definitions

- `readLayerList` (lexical_declaration, line 7, exported)
- `raw` (lexical_declaration, line 13, exported)
- `coerced` (lexical_declaration, line 19, exported)

## Contained in

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

## Uses

- [core/predicates/record.predicate.ts](https://banes-lab.com/source/context/core/predicates/record.predicate.ts.md)

## Linked from

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

## Source

```typescript
import type { ReadAudit } from "#core/observers/record.observer";
import { absolutePath } from "@ssot/paths";
import { isObject } from "#core/predicates/record.predicate";
import { join } from "node:path";
import { readJsonFile } from "#core/loaders/ontology.loader";

export const readLayerList = function readLayerList<T>(
    audit: ReadAudit,
    file: string,
    key: string,
    coerce: (value: unknown) => T | null,
): T[] {
    const raw = readJsonFile(join(absolutePath("govlab.context.layers"), file));
    if (!isObject(raw)) {
        audit.reject(raw, file);
        return [];
    }
    return audit.records(audit.track(raw, file)[key], file).flatMap((item) => {
        const coerced = coerce(item);
        if (coerced === null) {
            audit.reject(item, file);
            return [];
        }
        return [coerced];
    });
};
```
