# core/loaders/ecosystem.loader.ts

> 24 lines of code and 7 definitions.

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

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

## Definitions

- `loadProfiles` (lexical_declaration, line 22, exported)
- `loadEcosystems` (lexical_declaration, line 17, exported)
- `detectProfiles` (lexical_declaration, line 26, exported)
- `profileOf` (lexical_declaration, line 10)
- `CLASSIFICATION_FILE` (lexical_declaration, line 8)
- `parsed` (lexical_declaration, line 18, exported)
- `files` (lexical_declaration, line 27, exported)

## Contained in

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

## Uses

- [core/selectors/record.selector.ts](https://banes-lab.com/source/quality/core/selectors/record.selector.ts.md)

## Used by

- [core/resolvers/scope.resolver.ts](https://banes-lab.com/source/quality/core/resolvers/scope.resolver.ts.md)

## Linked from

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

## Source

```typescript
import { isRecord, recordAt, stringArrayField } from "#core/selectors/record.selector";
import { EXCLUDED_ECOSYSTEM } from "#configuration/constants/ecosystem.constants";
import type { LanguageProfile } from "#types/ecosystem.types";
import { absolutePath } from "@ssot/paths";
import { jsonRecord } from "#core/parsers/record.parser";
import { readFileSync } from "node:fs";

const CLASSIFICATION_FILE = "ecosystem.data.json";

const profileOf = function profileOf(id: string, entry: unknown): LanguageProfile[] {
    if (!isRecord(entry) || entry["kind"] === EXCLUDED_ECOSYSTEM) {
        return [];
    }
    return [{ id, markers: stringArrayField(entry, "markers") }];
};

export const loadEcosystems = function loadEcosystems(): Record<string, unknown> {
    const parsed = jsonRecord(readFileSync(absolutePath("govlab.quality.data", CLASSIFICATION_FILE), "utf8"));
    return recordAt(parsed, "ecosystems");
};

export const loadProfiles = function loadProfiles(): LanguageProfile[] {
    return Object.entries(loadEcosystems()).flatMap(([id, entry]) => profileOf(id, entry));
};

export const detectProfiles = function detectProfiles(rootFiles: readonly string[]): LanguageProfile[] {
    const files = new Set(rootFiles);
    return loadProfiles().filter((profile) => profile.markers.some((marker) => files.has(marker)));
};
```
