# core/adapters/tool.yamllint.adapter.ts

> 47 lines of code and 17 definitions.

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

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

## Definitions

- `runYamllint` (lexical_declaration, line 37)
- `SECTION` (lexical_declaration, line 16)
- `DEFAULT_COMMAND` (lexical_declaration, line 17)
- `DEFAULT_EXTENDS` (lexical_declaration, line 18)
- `govlabYamllintConfig` (lexical_declaration, line 20, exported)
- `config` (lexical_declaration, line 23, exported)
- `section` (lexical_declaration, line 24, exported)
- `inline` (lexical_declaration, line 25, exported)
- `{ rules }` (lexical_declaration, line 26, exported)
- `ignore` (lexical_declaration, line 30, exported)
- `{ command, config }` (lexical_declaration, line 38)
- `{ bin, prefix }` (lexical_declaration, line 39)
- `advisory` (lexical_declaration, line 40)
- `args` (lexical_declaration, line 41)
- `result` (lexical_declaration, line 42)
- `terminal` (lexical_declaration, line 43)
- `output` (lexical_declaration, line 47)

## Contained in

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

## Uses

- [core/parsers/tool.yamllint.parser.ts](https://banes-lab.com/source/quality/core/parsers/tool.yamllint.parser.ts.md)

## Linked from

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

## Source

```typescript
import { isRecord, stringArrayField, stringField } from "#core/selectors/record.selector";
import type { RunResult } from "#types/finding.types";
import type { RunnerContext } from "#types/tool.types";
import { commandHint } from "#configuration/strings/tool.strings";
import { commandOf } from "#core/lexers/invocation.lexer";
import { defineTool } from "#core/registries/tool.registry";
import { loadGovlabConfig } from "#core/loaders/config.loader";
import { parseYamllintOutput } from "#core/parsers/tool.yamllint.parser";
import process from "node:process";
import { sectionOf } from "#core/selectors/config.selector";
import { spawnTool } from "#core/adapters/invocation.adapter";
import { terminalOf } from "#core/classifiers/invocation.classifier";
import { toolAdvisory } from "#core/factories/tool.factory";
import { withMasterExclude } from "#core/selectors/exclusions.selector";

const SECTION = "yamllint";
const DEFAULT_COMMAND = "python -m yamllint";
const DEFAULT_EXTENDS = "default";

export const govlabYamllintConfig = async function govlabYamllintConfig(
    consumerRoot: string = process.cwd(),
): Promise<{ command: string; config: Record<string, unknown> }> {
    const config = await loadGovlabConfig(consumerRoot);
    const section = sectionOf(config, SECTION);
    const inline: Record<string, unknown> = { extends: stringField(section, "extends", DEFAULT_EXTENDS) };
    const { rules } = section;
    if (isRecord(rules) && Object.keys(rules).length > 0) {
        inline["rules"] = rules;
    }
    const ignore = withMasterExclude(config, stringArrayField(section, "ignore"));
    if (ignore.length > 0) {
        inline["ignore"] = ignore.join("\n");
    }
    return { command: stringField(section, "command", DEFAULT_COMMAND), config: inline };
};

const runYamllint = async function runYamllint(context: RunnerContext): Promise<RunResult> {
    const { command, config } = await govlabYamllintConfig(context.root);
    const { bin, prefix } = commandOf(command, SECTION);
    const advisory = toolAdvisory(context, SECTION, commandHint(SECTION, bin));
    const args = [...prefix, "-d", JSON.stringify(config), "-f", "parsable", ...context.paths];
    const result = spawnTool(bin, args, { cwd: context.root, encoding: "utf8", shell: false });
    const terminal = terminalOf(advisory, result);
    if (terminal !== null) {
        return terminal;
    }
    const output = `${result.stdout}${result.stderr}`;
    return { findings: parseYamllintOutput(output, context.ecosystem), fixedCount: 0, output };
};

defineTool({ ecosystems: ["yaml"], run: runYamllint, tool: SECTION });
```
