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

> 38 lines of code and 9 definitions.

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

Listed in [rules/eslint](https://banes-lab.com/api/source/governance/rules/eslint.md), after [rules/eslint/closure-no-cross-subsystem-import.eslint.rule.ts](https://banes-lab.com/source/governance/rules/eslint/closure-no-cross-subsystem-import.eslint.rule.ts.md) and before [rules/eslint/closure-no-double-cast.eslint.rule.ts](https://banes-lab.com/source/governance/rules/eslint/closure-no-double-cast.eslint.rule.ts.md).

## Definitions

- `isBannedDirective` (lexical_declaration, line 8)
- `create` (method_definition, line 14, exported)
- `program` (method_definition, line 17, exported)
- `BANNED_PREFIXES` (lexical_declaration, line 5)
- `PREVIEW_LENGTH` (lexical_declaration, line 6)
- `trimmed` (lexical_declaration, line 9)
- `src` (lexical_declaration, line 15, exported)
- `at` (lexical_declaration, line 19, exported)
- `preview` (lexical_declaration, line 23, exported)

## Uses

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

## Records this file checks

- [Policy as Code](https://banes-lab.com/records/architecture/policy-as-code.md)

## Source

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

const BANNED_PREFIXES = ["eslint-disable", "eslint-enable", "stylelint-disable", "stylelint-enable"];
const PREVIEW_LENGTH = 60;

const isBannedDirective = function isBannedDirective(value: string): boolean {
    const trimmed = value.trimStart();
    return BANNED_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;
                    if (!isBannedDirective(comment.value) || at === null || at === undefined) {
                        continue;
                    }
                    const preview = comment.value.trim().slice(0, PREVIEW_LENGTH).split("\n")[0] ?? "";
                    context.report({ data: { preview }, loc: at, messageId: "banned" });
                }
            },
        });
    },
    meta: {
        docs: {
            checks: defineCheck({ detects: [], enforces: ["architecture:policy-as-code"] }),
            description:
                "Bans `eslint-disable*` and `stylelint-disable*` comment directives. The `no-comments` rule exempts these to allow tooling directives, but the codebase's policy is no per-site rule disabling — if a rule fires on something genuinely correct, refine the rule or restructure the code. Inline-disable as escape hatch undermines architectural discipline.",
        },
        messages: {
            banned: "Disable directive `{{ preview }}` — disabling rules per-site masks architectural debt. Fix the underlying violation OR refine the rule. Inline-disable is banned codebase-wide.",
        },
        schema: [],
        type: "problem",
    },
} satisfies LocalRule;
```
