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": 105.3750100000002, "runsCount": 5, "measuredRunsAvgMs": 21.07500200000004, "measuredRunsMs": [ 24.79783199999997, 19.563640000000078, 20.759051999999883, 19.99068000000011, 20.26380600000016 ] }, { "name": "eslint", "totalMs": 11845.073306000002, "runsCount": 5, "measuredRunsAvgMs": 2369.0146612000003, "measuredRunsMs": [ 2686.1039550000005, 2281.501061, 2298.6185210000003, 2279.5962849999996, 2299.2534840000008 ] } ]
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.
If you want to use deno_lint
with Node, please refer to
@node-rs/deno-lint
package
which provides programmatic API as well as Webpack loader for deno_lint
.
examples/dlint/main.rs
provides a minimal standalone binary demonstrating how
deno_lint
can be used as a crate.
# Build standalone binary $ cargo build --example dlint $ ./target/debug/examples/dlint --help dlint USAGE: dlint <SUBCOMMAND> FLAGS: -h, --help Prints help information -V, --version Prints version information SUBCOMMANDS: help Prints this message or the help of the given subcommand(s) rules run $ ./target/debug/examples/dlint run ../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, see rust-toolchain.toml.
// check version $ rustc --version // build all targets $ cargo build --all-targets // test it $ cargo test
Prerequisites:
- Install
perf
,stackcollapse-perf
,c++filt
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 | c++filt | flamegraph > flame.svg # generate flamegraph
You can use rust-unmangle or rustfilt instead of c++filt.
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 --allow-env tools/lint.ts
passes. - If you've added a new rule, open a PR to https://github.com/denoland/deno-docs with a documentation for a rule.