# core/producers/tool.htmlhint.producer.ts

> 30 lines of code and 5 definitions.

Tree: GovLab Quality
Language: typescript
Layer: application
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-producers-tool-htmlhint-producer-ts
Source text: https://banes-lab.com/source/quality/core/producers/tool.htmlhint.producer.ts.txt

Listed in [core/producers](https://banes-lab.com/api/source/quality/core/producers.md), after [core/producers/tool.hadolint.producer.ts](https://banes-lab.com/source/quality/core/producers/tool.hadolint.producer.ts.md) and before [core/producers/tool.luacheck.producer.ts](https://banes-lab.com/source/quality/core/producers/tool.luacheck.producer.ts.md).

## Definitions

- `TOOL` (lexical_declaration, line 9)
- `DOCS` (lexical_declaration, line 10)
- `produce` (lexical_declaration, line 12)
- `configured` (lexical_declaration, line 13)
- `rules` (lexical_declaration, line 14)

## Contained in

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

## Source

```typescript
import type { CatalogProduct, CatalogRule } from "#types/catalog.types";
import { HTMLHINT_CANONICAL, HTMLHINT_DESCRIPTIONS } from "#configuration/constants/tool.htmlhint.constants";
import { ROOT } from "@ssot/paths";
import { byRuleId } from "#core/comparators/rule.comparator";
import { defineProducer } from "#core/registries/producer.registry";
import { loadGovlabConfig } from "#core/loaders/config.loader";
import { recordAt } from "#core/selectors/record.selector";

const TOOL = "htmlhint";
const DOCS = "https://htmlhint.com/docs/user-guide/rules";

const produce = async function produce(): Promise<CatalogProduct[]> {
    const configured = recordAt(recordAt(await loadGovlabConfig(ROOT), TOOL), "rules");
    const rules = Object.entries(configured)
        .filter(([, value]) => value !== false)
        .map(([ruleId]): CatalogRule => ({
            canonical: HTMLHINT_CANONICAL.get(ruleId) ?? null,
            category: "html",
            deprecated: false,
            description: HTMLHINT_DESCRIPTIONS.get(ruleId) ?? ruleId,
            ecosystem: "html",
            fixable: false,
            name: ruleId,
            recommended: true,
            ruleId,
            tool: TOOL,
            url: `${DOCS}/${ruleId}`,
        }))
        .toSorted(byRuleId);
    return [{ rules, source: TOOL, summary: { tool: TOOL, total: rules.length } }];
};

defineProducer({ name: TOOL, produce, refresh: "manual" });
```
