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
Visit https://lint.deno.land for the list of available rules.
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.
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
,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.