deno_lint
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.
NOTE Work-in-progress
Current focus is on getting recommended
set of rules from ESLint and @typescript-eslint
working out of the box.
See the roadmap
Blazing fast, see comparison with ESLint:
json
[
{
"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-ts-ignore
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-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-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-unexpected-multiline
no-unsafe-finally
no-unsafe-negation
no-unused-labels
no-unused-vars
no-var
no-with
prefer-as-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.
```ts // deno-lint-ignore-file
function foo(): any { // ... } ```
Ignore directive must be placed before first stament or declaration:
```ts // 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 { // ... } ```
To ignore certain diagnostic // deno-lint-ignore <codes...>
directive should be placed
before offending line.
```ts // 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.
shell
$ ▶ 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.44.0).
```shell // check version $ rustc --version rustc 1.44.0 (49cae5576 2020-06-01)
// build all targets $ cargo build --all-targets
// test it $ cargo test ```
Prerequisites:
perf
, (stackcollapse-perf
)[https://github.com/brendangregg/FlameGraph/blob/master/flamegraph.pl], rust-unmangle
and flamegraph
shell
$ 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:
cargo test
passes.deno run --allow-run tools/format.ts
deno run --allow-run tools/lint.ts
passes.