# core/converters/rule.converter.ts

> 30 lines of code and 7 definitions.

Tree: GovLab Quality
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-converters-rule-converter-ts
Source text: https://banes-lab.com/source/quality/core/converters/rule.converter.ts.txt

Listed in [core/converters](https://banes-lab.com/api/source/quality/core/converters.md), after [core/converters/filename.converter.ts](https://banes-lab.com/source/quality/core/converters/filename.converter.ts.md) and before [core/converters/stylelint.converter.ts](https://banes-lab.com/source/quality/core/converters/stylelint.converter.ts.md).

## Definitions

- `stylelintRules` (lexical_declaration, line 22, exported)
- `eslintRuleEntries` (lexical_declaration, line 12, exported)
- `ESLINT_SHAPE` (lexical_declaration, line 9)
- `STYLELINT_SHAPE` (lexical_declaration, line 10)
- `rule` (lexical_declaration, line 14, exported)
- `plugin` (lexical_declaration, line 26, exported)
- `meta` (lexical_declaration, line 27, exported)

## Contained in

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

## Uses

- [configuration/strings/rule.strings.ts](https://banes-lab.com/source/quality/configuration/strings/rule.strings.ts.md)
- [core/predicates/eslint.predicate.ts](https://banes-lab.com/source/quality/core/predicates/eslint.predicate.ts.md)
- [core/predicates/stylelint.predicate.ts](https://banes-lab.com/source/quality/core/predicates/stylelint.predicate.ts.md)

## Linked from

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

## Source

```typescript
import { isStylelintMeta, isStylelintPlugin } from "#core/predicates/stylelint.predicate";
import type { GovlabStylelintMeta } from "#types/stylelint.types";
import type { Plugin } from "stylelint";
import type { Rule } from "eslint";
import type { RuleFile } from "#types/rule.types";
import { isRuleModule } from "#core/predicates/eslint.predicate";
import { notARule } from "#configuration/strings/rule.strings";

const ESLINT_SHAPE = "default eslint rule module";
const STYLELINT_SHAPE = "default stylelint plugin and its RULE_META";

export const eslintRuleEntries = function eslintRuleEntries(files: readonly RuleFile[]): [string, Rule.RuleModule][] {
    return files.map(({ file, id, module }): [string, Rule.RuleModule] => {
        const rule = module["default"];
        if (!isRuleModule(rule)) {
            throw new Error(notARule(file, ESLINT_SHAPE));
        }
        return [id, rule];
    });
};

export const stylelintRules = function stylelintRules(
    files: readonly RuleFile[],
): { meta: GovlabStylelintMeta; plugin: Plugin }[] {
    return files.map(({ file, module }) => {
        const plugin = module["default"];
        const meta = module["RULE_META"];
        if (!isStylelintPlugin(plugin) || !isStylelintMeta(meta)) {
            throw new Error(notARule(file, STYLELINT_SHAPE));
        }
        return { meta, plugin };
    });
};
```
