# core/validators/dependency.validator.ts

> 23 lines of code and 7 definitions.

Tree: GovLab Quality
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-validators-dependency-validator-ts
Source text: https://banes-lab.com/source/quality/core/validators/dependency.validator.ts.txt

Listed in [core/validators](https://banes-lab.com/api/source/quality/core/validators.md), after [core/validators/css.viewport.validator.ts](https://banes-lab.com/source/quality/core/validators/css.viewport.validator.ts.md) and before [core/validators/filename.validator.ts](https://banes-lab.com/source/quality/core/validators/filename.validator.ts.md).

## Definitions

- `knownEcosystems` (lexical_declaration, line 6)
- `canonicalEcosystem` (lexical_declaration, line 10)
- `ecosystem` (lexical_declaration, line 11)
- `listed` (lexical_declaration, line 13)
- `validateInstallRequest` (lexical_declaration, line 19, exported)
- `known` (lexical_declaration, line 20, exported)
- `ecosystems` (lexical_declaration, line 21, exported)

## Contained in

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

## Uses

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

## Linked from

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

## Source

```typescript
import { EMPTY_REQUEST, unknownEcosystem } from "#configuration/strings/dependency.strings";
import { ECOSYSTEM_SHORTCODES } from "#configuration/constants/ecosystem.constants";
import type { InstallRequest } from "#types/dependency.types";
import { loadInstallRegistry } from "#core/loaders/dependency.loader";

const knownEcosystems = function knownEcosystems(): Set<string> {
    return new Set(loadInstallRegistry().records.map((record) => record.ecosystem));
};

const canonicalEcosystem = function canonicalEcosystem(known: Set<string>, name: string): string {
    const ecosystem = ECOSYSTEM_SHORTCODES[name] ?? name;
    if (!known.has(ecosystem)) {
        const listed = [...known].sort((a, b) => a.localeCompare(b)).join(", ");
        throw new Error(unknownEcosystem(name, listed, Object.keys(ECOSYSTEM_SHORTCODES).join(", ")));
    }
    return ecosystem;
};

export const validateInstallRequest = function validateInstallRequest(request: InstallRequest): InstallRequest {
    const known = knownEcosystems();
    const ecosystems = [...new Set(request.ecosystems.map((name) => canonicalEcosystem(known, name)))];
    if (ecosystems.length === 0 && !request.auto) {
        throw new Error(EMPTY_REQUEST);
    }
    return { ...request, ecosystems };
};
```
