# core/adapters/dependency.adapter.ts

> 14 lines of code and 3 definitions.

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

Listed in [core/adapters](https://banes-lab.com/api/source/quality/core/adapters.md), before [core/adapters/eslint.adapter.ts](https://banes-lab.com/source/quality/core/adapters/eslint.adapter.ts.md).

## Definitions

- `runInstall` (lexical_declaration, line 7, exported)
- `NPM` (lexical_declaration, line 4)
- `NPM_INSTALL_DEV` (lexical_declaration, line 5)

## Contained in

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

## Used by

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

## Linked from

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

## Source

```typescript
import type { InstallPlan, InstallReport } from "#types/dependency.types";
import { execFileSync } from "node:child_process";

const NPM = "npm";
const NPM_INSTALL_DEV = ["install", "--save-dev"];

export const runInstall = function runInstall(
    plan: InstallPlan,
    { dryRun, root }: { dryRun: boolean; root: string },
): InstallReport {
    if (dryRun || plan.npmDeps.length === 0) {
        return { installed: [], systemInstructions: plan.systemInstructions };
    }
    execFileSync(NPM, [...NPM_INSTALL_DEV, ...plan.npmDeps], { cwd: root, stdio: "inherit" });
    return { installed: plan.npmDeps, systemInstructions: plan.systemInstructions };
};
```
