A Rust crate for writing fast JavaScript and TypeScript linters.
This crate powers deno lint
, but is not Deno specific
and can be used to write linters for Node as well.
Supports recommended
set of rules from ESLint and @typescript-eslint
out of the box
with no config.
See the roadmap
Blazing fast, see comparison with ESLint:
[
{
"name": "deno_lint",
"totalMs": 247.20262200000025,
"runsCount": 5,
"measuredRunsAvgMs": 49.44052440000005,
"measuredRunsMs": [
49.016501999999946,
49.56810500000006,
49.68610600000011,
48.97360200000003,
49.958307000000104
]
},
{
"name": "eslint",
"totalMs": 12214.295835,
"runsCount": 5,
"measuredRunsAvgMs": 2442.859167,
"measuredRunsMs": [
2703.5126729999997,
2380.431925,
2369.1452910000007,
2362.1451909999996,
2399.0607550000004
]
}
]
Benchmarks are run during CI on Ubuntu, using the same set of rules for both linters.
Test subject is oak
server consisting of about 50 files.
See ./benchmarks/
directory for more info.
adjacent-overload-signatures
ban-ts-comment
ban-types
ban-untagged-ignore
ban-untagged-todo
constructor-super
default-param-last
eqeqeq
explicit-function-return-type
explicit-module-boundary-types
for-direction
getter-return
no-array-constructor
no-async-promise-executor
no-await-in-loop
no-case-declarations
no-class-assign
no-compare-neg-zero
no-cond-assign
no-const-assign
no-constant-condition
no-control-regex
no-debugger
no-delete-var
no-dupe-args
no-dupe-class-members
no-dupe-else-if
no-dupe-keys
no-duplicate-case
no-empty
no-empty-character-class
no-empty-interface
no-empty-pattern
no-eval
no-ex-assign
no-explicit-any
no-extra-boolean-cast
no-extra-non-null-assertion
no-extra-semi
no-func-assign
no-global-assign
no-import-assign
no-inferrable-types
no-invalid-regexp
no-irregular-whitespace
no-misused-new
no-mixed-spaces-and-tabs
no-namespace
no-new-symbol
no-non-null-asserted-optional-chain
no-non-null-assertion
no-obj-calls
no-octal
no-prototype-builtins
no-redeclare
no-regex-spaces
no-self-assign
no-setter-return
no-shadow-restricted-names
no-sparse-arrays
no-this-alias
no-this-before-super
no-throw-literal
no-undef
no-unexpected-multiline
no-unsafe-finally
no-unsafe-negation
no-unused-labels
no-unused-vars
no-var
no-with
prefer-as-const
prefer-const
prefer-namespace-keyword
require-yield
single-var-declarator
triple-slash-reference
use-isnan
valid-typeof
To ignore whole file // deno-lint-ignore-file
directive should placed at the top of the file.
// deno-lint-ignore-file
function foo(): any {
// ...
}
Ignore directive must be placed before first stament or declaration:
// Copyright 2020 the Deno authors. All rights reserved. MIT license.
/**
* Some JS doc
**/
// deno-lint-ignore-file
import { bar } from "./bar.js";
function foo(): any {
// ...
}
You can also ignore certain diagnostics in the whole file
// deno-lint-ignore-file no-explicit-any no-empty
function foo(): any {
// ...
}
To ignore certain diagnostic // deno-lint-ignore <codes...>
directive should be placed
before offending line.
// deno-lint-ignore no-explicit-any
function foo(): any {
// ...
}
// deno-lint-ignore no-explicit-any explicit-function-return-type
function bar(a: any) {
// ...
}
Specyfing rule code that will be ignored is required.
examples/dlint/main.rs
provides a minimal standalone binary demonstrating
how deno_lint
can be used as a crate.
$ ▶ target/debug/examples/dlint ../deno/std/http/server.ts ../deno/std/http/file_server.ts
(no-empty) Empty block statement
--> ../deno/std/http/server.ts:93:14
|
93 | } catch {}
| ^^
|
(no-empty) Empty block statement
--> ../deno/std/http/server.ts:111:44
|
111 | while ((await body.read(buf)) !== null) {}
| ^^
|
(no-empty) Empty block statement
--> ../deno/std/http/server.ts:120:41
|
120 | constructor(public listener: Listener) {}
| ^^
|
(ban-untagged-todo) TODO should be tagged with (@username) or (#issue)
--> ../deno/std/http/file_server.ts:5:0
|
5 | // TODO Stream responses instead of reading them into memory.
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
(ban-untagged-todo) TODO should be tagged with (@username) or (#issue)
--> ../deno/std/http/file_server.ts:6:0
|
6 | // TODO Add tests like these:
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
(ban-untagged-todo) TODO should be tagged with (@username) or (#issue)
--> ../deno/std/http/file_server.ts:137:0
|
137 | // TODO: simplify this after deno.stat and deno.readDir are fixed
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
(no-empty) Empty block statement
--> ../deno/std/http/file_server.ts:155:16
|
155 | } catch (e) {}
| ^^
|
Found 7 problems
For more concrete implementation visit deno
Make sure to have latest stable version of Rust installed (1.47.0).
// check version
$ rustc --version
rustc 1.47.0 (18bf6b4f0 2020-10-07)
// build all targets
$ cargo build --all-targets
// test it
$ cargo test
Prerequisites:
- Install
perf
, (stackcollapse-perf
)[https://github.com/brendangregg/FlameGraph/blob/master/flamegraph.pl],rust-unmangle
andflamegraph
$ RUSTFLAGS='-g' cargo build --release --all-targets # build target
$ sudo perf record --call-graph dwarf ./target/release/examples/dlint benchmarks/oak/**.ts # create performance profile
$ perf script | stackcollapse-perf | rust-unmangle | flamegraph > flame.svg # generate flamegraph
These commands can take a few minutes to run.
-
If you are going to work on an issue, mention so in the issue comments before you start working on the issue.
-
Please be professional in the forums. We follow Rust's code of conduct (CoC) Have a problem? Email ry@tinyclouds.org.
-
Ask for help in the community chat room.
Before submitting, please make sure the following is done:
- That there is a related issue and it is referenced in the PR text.
- There are tests that cover the changes.
- Ensure
cargo test
passes. - Format your code with
deno run --allow-run tools/format.ts
- Make sure
deno run --allow-run tools/lint.ts
passes.