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

> 39 lines of code and 11 definitions.

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

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

## Definitions

- `orNull` (lexical_declaration, line 10)
- `ruleOf` (lexical_declaration, line 14)
- `TOOL` (lexical_declaration, line 7)
- `DOCS` (lexical_declaration, line 8)
- `{ choices }` (lexical_declaration, line 15)
- `fallback` (lexical_declaration, line 16)
- `name` (lexical_declaration, line 17)
- `produce` (lexical_declaration, line 37)
- `info` (lexical_declaration, line 38)
- `options` (lexical_declaration, line 39)
- `rules` (lexical_declaration, line 40)

## Contained in

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

## Linked from

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

## Source

```typescript
import type { CatalogProduct, CatalogRule } from "#types/catalog.types";
import { getSupportInfo, version } from "prettier";
import { isRecord, stringField } from "#core/selectors/record.selector";
import { byRuleId } from "#core/comparators/rule.comparator";
import { defineProducer } from "#core/registries/producer.registry";

const TOOL = "prettier";
const DOCS = "https://prettier.io/docs/options";

const orNull = function orNull(value: string): string | null {
    return value === "" ? null : value;
};

const ruleOf = function ruleOf(option: Record<string, unknown>): CatalogRule {
    const { choices } = option;
    const fallback = option["default"];
    const name = stringField(option, "name");
    return {
        canonical: null,
        category: orNull(stringField(option, "category")) ?? "option",
        choices: Array.isArray(choices)
            ? choices.map((choice: unknown) => (isRecord(choice) ? choice["value"] : null))
            : null,
        default: fallback === undefined ? null : fallback,
        description: orNull(stringField(option, "description")),
        ecosystem: "javascript",
        kind: "format-option",
        name,
        ruleId: name,
        tool: TOOL,
        toolVersion: version,
        type: orNull(stringField(option, "type")),
        url: DOCS,
    };
};

const produce = async function produce(): Promise<CatalogProduct[]> {
    const info = await getSupportInfo();
    const options: unknown[] = info.options;
    const rules = options.filter(isRecord).map(ruleOf).toSorted(byRuleId);
    return [{ rules, source: TOOL, summary: { tool: TOOL, toolVersion: version, total: rules.length } }];
};

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