1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use crate::rule_prelude::*;

declare_lint! {
    /**
    Disallow the use of debugger statements.

    `debugger` statements are used to tell the environment executing the code to start an appropriate
    debugger. These statements are rendered useless by modern IDEs which have built in breakpoint support.
    Having them in production code is erroneous as it will tell the browser to stop running and open a debugger.

    ## Invalid Code Examples

    ```js
    function doSomething() {
        debugger;
        doSomethingElse();
    }
    ```
    */
    #[derive(Default)]
    NoDebugger,
    errors,
    "no-debugger"
}

#[typetag::serde]
impl CstRule for NoDebugger {
    fn check_node(&self, node: &SyntaxNode, ctx: &mut RuleCtx) -> Option<()> {
        if node.kind() == SyntaxKind::DEBUGGER_STMT {
            let err = ctx
                .err(self.name(), "debugger statements are not allowed")
                .primary(node, "");

            ctx.add_err(err);
        }
        None
    }
}

rule_tests! {
    NoDebugger::default(),
    err: {
        "debugger",
        "debugger;"
    },
    ok: {}
}