# core/adapters/invocation.adapter.ts

> 25 lines of code and 6 definitions.

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

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

## Definitions

- `commandOutput` (lexical_declaration, line 17, exported)
- `UNKNOWN_VERSION` (lexical_declaration, line 7)
- `spawnTool` (lexical_declaration, line 9, exported)
- `commandVersion` (lexical_declaration, line 25, exported)
- `result` (lexical_declaration, line 26, exported)
- `first` (lexical_declaration, line 27, exported)

## Contained in

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

## Uses

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

## Linked from

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

## Source

```typescript
import { OUTPUT_LIMIT } from "#configuration/constants/tool.constants";
import type { SpawnSyncOptionsWithStringEncoding } from "node:child_process";
import type { ToolSpawn } from "#types/tool.types";
import { commandFailed } from "#configuration/strings/catalog.strings";
import spawn from "cross-spawn";

const UNKNOWN_VERSION = "unknown";

export const spawnTool = function spawnTool(
    bin: string,
    args: string[],
    options: SpawnSyncOptionsWithStringEncoding,
): ToolSpawn {
    return spawn.sync(bin, args, { maxBuffer: OUTPUT_LIMIT, ...options });
};

export const commandOutput = function commandOutput(bin: string, args: string[]): string {
    const result = spawnTool(bin, args, { encoding: "utf8" });
    if (result.error instanceof Error || result.status !== 0) {
        throw new Error(commandFailed([bin, ...args].join(" "), result.stderr));
    }
    return result.stdout;
};

export const commandVersion = function commandVersion(bin: string, args: string[]): string {
    const result = spawnTool(bin, args, { encoding: "utf8" });
    const first = result.status === 0 ? (result.stdout.split("\n")[0] ?? "").trim() : "";
    return first === "" ? UNKNOWN_VERSION : first;
};
```
