# core/formatters/dependency.formatter.ts

> 34 lines of code and 4 definitions.

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

Listed in [core/formatters](https://banes-lab.com/api/source/quality/core/formatters.md), after [core/formatters/config.yaml.formatter.ts](https://banes-lab.com/source/quality/core/formatters/config.yaml.formatter.ts.md) and before [core/formatters/report.formatter.ts](https://banes-lab.com/source/quality/core/formatters/report.formatter.ts.md).

## Definitions

- `printPlan` (lexical_declaration, line 17, exported)
- `printReport` (lexical_declaration, line 32, exported)
- `listOrNone` (lexical_declaration, line 13)
- `lines` (lexical_declaration, line 18, exported)

## Contained in

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

## Uses

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

## Used by

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

## Linked from

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

## Source

```typescript
import type { InstallPlan, InstallReport } from "#types/dependency.types";
import {
    NONE_LABEL,
    eslintPluginsLine,
    generatorsLine,
    installedLine,
    npmLine,
    planHeading,
    systemInstructionLine,
    systemToolsLine,
} from "#configuration/strings/dependency.strings";

const listOrNone = function listOrNone(values: readonly string[]): string {
    return values.length > 0 ? values.join(", ") : NONE_LABEL;
};

export const printPlan = function printPlan(plan: InstallPlan): string {
    const lines: string[] = [
        planHeading(plan.ecosystems.join(", ")),
        npmLine(plan.npmDeps.length, listOrNone(plan.npmDeps)),
    ];
    if (plan.systemInstructions.length > 0) {
        lines.push(systemToolsLine(plan.systemInstructions.map((instruction) => instruction.system).join(", ")));
    }
    if (plan.eslintPlugins.length > 0) {
        lines.push(eslintPluginsLine(plan.eslintPlugins.join(", ")));
    }
    lines.push(generatorsLine(listOrNone(plan.emitters)));
    return `${lines.join("\n")}\n`;
};

export const printReport = function printReport(report: InstallReport): string {
    return [
        installedLine(report.installed.length),
        ...report.systemInstructions.map((instruction) => systemInstructionLine(instruction.system)),
    ].join("");
};
```
