# core/factories/dependency.factory.ts

> 30 lines of code and 7 definitions.

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

Listed in [core/factories](https://banes-lab.com/api/source/quality/core/factories.md), after [core/factories/config.factory.ts](https://banes-lab.com/source/quality/core/factories/config.factory.ts.md) and before [core/factories/eslint.factory.ts](https://banes-lab.com/source/quality/core/factories/eslint.factory.ts.md).

## Definitions

- `sortedUnique` (lexical_declaration, line 5)
- `computePlan` (lexical_declaration, line 9, exported)
- `records` (lexical_declaration, line 10, exported)
- `npmDeps` (lexical_declaration, line 11, exported)
- `systemInstructions` (lexical_declaration, line 14, exported)
- `eslintPlugins` (lexical_declaration, line 19, exported)
- `emitters` (lexical_declaration, line 24, exported)

## Contained in

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

## Linked from

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

## Source

```typescript
import { ESLINT_EMITTER, NO_EMITTER } from "#configuration/constants/emitter.constants";
import type { InstallPlan } from "#types/dependency.types";
import { loadInstallRegistry } from "#core/loaders/dependency.loader";

const sortedUnique = function sortedUnique(values: readonly string[]): string[] {
    return [...new Set(values)].sort((a, b) => a.localeCompare(b));
};

export const computePlan = function computePlan(ecosystems: string[]): InstallPlan {
    const records = loadInstallRegistry().records.filter((record) => ecosystems.includes(record.ecosystem));
    const npmDeps = records.flatMap((record) =>
        typeof record.npm === "string" && record.npm.length > 0 ? [record.npm] : [],
    );
    const systemInstructions = records.flatMap((record) =>
        typeof record.system === "string" && record.system.length > 0
            ? [{ system: record.system, tool: record.tool }]
            : [],
    );
    const eslintPlugins = records.flatMap((record) =>
        record.isPlugin && typeof record.pluginNamespace === "string" && record.emitter === ESLINT_EMITTER
            ? [record.pluginNamespace]
            : [],
    );
    const emitters = records.map((record) => record.emitter).filter((emitter) => emitter !== NO_EMITTER);
    return {
        ecosystems,
        emitters: sortedUnique(emitters),
        eslintPlugins: sortedUnique(eslintPlugins),
        npmDeps: sortedUnique(npmDeps),
        systemInstructions,
    };
};
```
