Behaviour for custom lint rules in Elixir.
Rules receive the parsed ESTree AST (from OXC.parse/2) and return
diagnostics. Use OXC.walk/2, OXC.collect/2, or OXC.postwalk/3
for traversal.
Example
defmodule MyApp.NoConsoleLog do
@behaviour OXC.Lint.Rule
@impl true
def meta do
%{
name: "my-app/no-console-log",
description: "Disallow console.log in production code",
category: :restriction,
fixable: false
}
end
@impl true
def run(ast, _context) do
OXC.collect(ast, fn
%{
type: :call_expression,
callee: %{
type: :member_expression,
object: %{type: :identifier, name: "console"},
property: %{type: :identifier, name: "log"}
},
start: start,
end: stop
} ->
{:keep, %{span: {start, stop}, message: "Unexpected console.log"}}
_ ->
:skip
end)
end
end
Summary
Types
@type diagnostic() :: %{ :span => {non_neg_integer(), non_neg_integer()}, :message => String.t(), optional(:help) => String.t() | nil, optional(:labels) => [{non_neg_integer(), non_neg_integer()}], optional(:fix) => String.t() | nil }
Callbacks
@callback meta() :: meta()
@callback run(ast :: map(), context :: context()) :: [diagnostic()]