elm-review/src/Lint/Rule/NoDebug.elm

105 lines
2.6 KiB
Elm
Raw Normal View History

2018-11-11 01:43:58 +03:00
module Lint.Rule.NoDebug exposing (rule)
2017-01-07 23:17:01 +03:00
{-| Forbid the use of the [`Debug`](https://package.elm-lang.org/packages/elm/core/latest/Debug) module before it goes into production or fails in the CI.
2018-11-05 16:44:22 +03:00
# Rule
@docs rule
-}
import Elm.Syntax.Expression exposing (Expression(..))
import Elm.Syntax.Import exposing (Import)
import Elm.Syntax.Node as Node exposing (Node)
import Lint.Rule as Rule exposing (Error, Rule)
{-| Forbid the use of the [`Debug`](https://package.elm-lang.org/packages/elm/core/latest/Debug) module before it goes into production or fails in the CI.
config =
2019-07-25 15:35:58 +03:00
[ NoDebug.rule
]
2019-07-03 15:19:29 +03:00
## Fail
2018-11-05 16:44:22 +03:00
if Debug.log "condition" condition then
a
else
b
if condition then
Debug.todo "Nooo!"
2018-11-05 16:44:22 +03:00
else
value
2018-11-05 16:44:22 +03:00
2019-07-03 15:19:29 +03:00
## Success
if condition then
a
2018-11-05 16:44:22 +03:00
else
b
2018-11-05 16:44:22 +03:00
# When (not) to use this rule
You should use this rule if you're developing a package meant to be published,
or an application that is put into production, and wish to know about the use of
the [`Debug`](https://package.elm-lang.org/packages/elm/core/latest/Debug)
module before committing your changes.
You should not use this rule if you are developing an application that is not
put into production, and you do not care about having stray debug logs or
runtime exceptions caused by [`Debug.todo`](https://package.elm-lang.org/packages/elm/core/latest/Debug#todo),
and you do not ship to production.
-}
2018-11-11 01:37:18 +03:00
rule : Rule
2019-06-15 22:14:40 +03:00
rule =
Rule.newSchema "NoDebug"
|> Rule.withSimpleImportVisitor importVisitor
|> Rule.withSimpleExpressionVisitor expressionVisitor
2019-06-24 01:32:27 +03:00
|> Rule.fromSchema
2017-01-07 23:17:01 +03:00
2018-11-11 01:37:18 +03:00
error : Node a -> Error
error node =
Rule.error
{ message = "Remove the use of `Debug` before shipping to production"
, details = [ "The `Debug` module is useful when developing, but is not meant to be shipped to production or published in a package. I suggest removing it's use before committing and attempting to push to production." ]
}
(Node.range node)
importVisitor : Node Import -> List Error
importVisitor node =
let
moduleNameNode : Node (List String)
moduleNameNode =
node |> Node.value |> .moduleName
in
if Node.value moduleNameNode == [ "Debug" ] then
[ error moduleNameNode ]
else
[]
expressionVisitor : Node Expression -> List Error
expressionVisitor node =
case Node.value node of
FunctionOrValue moduleName fnName ->
if moduleName == [ "Debug" ] then
[ error node ]
2018-11-05 16:44:22 +03:00
else
[]
2017-01-07 23:17:01 +03:00
_ ->
[]