# rules/eslint/no-comments.eslint.rule.ts

> 73 lines of code and 19 definitions.

Tree: Governance tree
Language: typescript
Canonical: https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-no-comments-eslint-rule-ts
Source text: https://banes-lab.com/source/governance/rules/eslint/no-comments.eslint.rule.ts.txt

Listed in [rules/eslint](https://banes-lab.com/api/source/governance/rules/eslint.md), after [rules/eslint/file-length.eslint.rule.ts](https://banes-lab.com/source/governance/rules/eslint/file-length.eslint.rule.ts.md) and before [rules/eslint/no-exclusion-membership.eslint.rule.ts](https://banes-lab.com/source/governance/rules/eslint/no-exclusion-membership.eslint.rule.ts.md).

## Definitions

- `isDirective` (lexical_declaration, line 21)
- `create` (method_definition, line 27, exported)
- `program` (method_definition, line 30, exported)
- `DIRECTIVE_PREFIXES` (lexical_declaration, line 5)
- `PREVIEW_LENGTH` (lexical_declaration, line 17)
- `NEWLINE_CODE` (lexical_declaration, line 18)
- `SPACE_CODE` (lexical_declaration, line 19)
- `trimmed` (lexical_declaration, line 22)
- `src` (lexical_declaration, line 28, exported)
- `at` (lexical_declaration, line 32, exported)
- `{ range }` (lexical_declaration, line 33, exported)
- `preview` (lexical_declaration, line 37, exported)
- `payload` (lexical_declaration, line 38, exported)
- `[start, rawEnd]` (lexical_declaration, line 39, exported)
- `fix` (method_definition, line 42, exported)
- `end` (lexical_declaration, line 43, exported)
- `text` (lexical_declaration, line 44, exported)
- `lineStart` (lexical_declaration, line 48, exported)
- `trimStart` (lexical_declaration, line 52, exported)

## Uses

- [shared/factories/listener.factory.ts](https://banes-lab.com/source/governance/shared/factories/listener.factory.ts.md)

## Source

```typescript
import type { LocalRule, RuleContext, RuleFixer, RuleListener } from "../../types/rule.types.ts";
import { defineCheck } from "@govlab/context/check";
import { listener } from "../../shared/factories/listener.factory.ts";

const DIRECTIVE_PREFIXES = [
    "eslint-disable",
    "eslint-enable",
    "eslint-env",
    "global ",
    "globals ",
    "@ts-",
    "!",
    "c8",
    "/",
];

const PREVIEW_LENGTH = 60;
const NEWLINE_CODE = 10;
const SPACE_CODE = 32;

const isDirective = function isDirective(value: string): boolean {
    const trimmed = value.trimStart();
    return DIRECTIVE_PREFIXES.some((prefix) => trimmed.startsWith(prefix));
};

export default {
    create(context: RuleContext): RuleListener {
        const src = context.sourceCode;
        return listener({
            program(): void {
                for (const comment of src.getAllComments()) {
                    const at = comment.loc;
                    const { range } = comment;
                    if (isDirective(comment.value) || range === undefined || at === null || at === undefined) {
                        continue;
                    }
                    const preview = comment.value.trim().slice(0, PREVIEW_LENGTH).replaceAll("\n", " ");
                    const payload = { preview };
                    const [start, rawEnd] = range;
                    context.report({
                        data: payload,
                        fix(fixer: RuleFixer) {
                            let end = rawEnd;
                            const text = src.getText();
                            if (end < text.length && (text.codePointAt(end) ?? 0) === NEWLINE_CODE) {
                                end += 1;
                            }
                            const lineStart = text.slice(0, start).lastIndexOf("\n") + 1;
                            if (text.slice(lineStart, start).trim().length === 0) {
                                return fixer.removeRange([lineStart, end]);
                            }
                            let trimStart = start;
                            while (trimStart > lineStart && (text.codePointAt(trimStart - 1) ?? 0) === SPACE_CODE) {
                                trimStart -= 1;
                            }
                            return fixer.removeRange([trimStart, end]);
                        },
                        loc: at,
                        messageId: "report",
                    });
                }
            },
        });
    },
    meta: {
        docs: {
            checks: defineCheck({ detects: [], enforces: [] }),
            description: "Remove all comments — code is self-documenting",
        },
        fixable: "code",
        messages: {
            report: 'Comment "{{ preview }}" — delete it. If intent is unclear without prose, rename. Auto-fix removes.',
        },
        schema: [],
        type: "problem",
    },
} satisfies LocalRule;
```
