Skip to main content
On this page

deno lint

Deno ships with a built-in linter that analyzes your code for potential errors, bugs, and stylistic issues. For a broader overview, see Linting and Formatting.

Basic usage Jump to heading

Lint all TypeScript and JavaScript files in the current directory:

>_
deno lint

Lint specific files or directories:

>_
deno lint src/ main.ts

Watch mode Jump to heading

Automatically re-lint files when they change:

>_
deno lint --watch

Using in CI Jump to heading

deno lint exits with a non-zero status code when it finds violations, making it suitable for CI pipelines:

>_
deno lint
deno fmt --check
deno test

Available rules Jump to heading

Deno's linter includes over 100 rules. View all available rules:

>_
deno lint --rules

For a full list with documentation, visit the lint rules reference.

Configuring rules in deno.json Jump to heading

Customize which rules are active in your deno.json:

deno.json
{
  "lint": {
    "rules": {
      "tags": ["recommended"],
      "include": ["ban-untagged-todo"],
      "exclude": ["no-unused-vars"]
    }
  }
}
  • tags — rule sets to enable. Available tags: recommended, fresh
  • include — additional individual rules to enable
  • exclude — rules to disable even if included by a tag

See the Configuration page for all available options.

Including and excluding files Jump to heading

Specify which files to lint in deno.json:

deno.json
{
  "lint": {
    "include": ["src/"],
    "exclude": ["src/testdata/", "src/generated/**/*.ts"]
  }
}

You can also exclude files from the command line:

>_
deno lint --ignore=dist/,build/

Lint plugins Jump to heading

You can extend the linter with custom rules using lint plugins.

Ignore directives Jump to heading

File level Jump to heading

To ignore a whole file use // deno-lint-ignore-file at the top of the file:

// deno-lint-ignore-file

function foo(): any {
  // ...
}

You can also specify the reason for ignoring the file:

// deno-lint-ignore-file -- reason for ignoring

function foo(): any {
  // ...
}

The ignore directive must be placed before the first statement or declaration:

// Copyright 2018-2024 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 {
  // ...
}

If there are multiple // deno-lint-ignore-file directives, all but the first one are ignored:

// This is effective
// deno-lint-ignore-file no-explicit-any no-empty

// But this is NOT effective
// deno-lint-ignore-file no-debugger

function foo(): any {
  debugger; // not ignored!
}

Line level Jump to heading

To ignore specific diagnostics use // deno-lint-ignore <codes...> on the preceding line of the 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) {
  // ...
}

You must specify the names of the rules to be ignored.

You can also specify the reason for ignoring the diagnostic:

// deno-lint-ignore no-explicit-any -- reason for ignoring
function foo(): any {
  // ...
}

Ignore ban-unused-ignore itself Jump to heading

deno lint provides ban-unused-ignore rule, which will detect ignore directives that don't ever suppress certain diagnostics. This is useful when you want to discover ignore directives that are no longer necessary after refactoring the code.

In a few cases, however, you might want to ignore ban-unused-ignore rule itself. One of the typical cases would be when working with auto-generated files; it makes sense to add file-level ignore directives for some rules, and there's almost no need for detecting unused directives via ban-unused-ignore in this case.

You can use // deno-lint-ignore-file ban-unused-ignore as always if you want to suppress the rule for a whole file:

// deno-lint-ignore-file ban-unused-ignore no-explicit-any

// `no-explicit-any` isn't used but you'll get no diagnostics because of ignoring
// `ban-unused-ignore`
console.log(42);

Do note that ignoring ban-unused-ignore itself only works via file-level ignore directives. This means that per line directives, like // deno-lint-ignore ban-unused-ignore, don't work at all. If you want to ignore ban-unused-ignore for some special reasons, make sure to add it as a file-level ignore directive.

Command line usage:
deno lint [OPTIONS] [files]...

Lint JavaScript/TypeScript source code.

deno lint
deno lint myfile1.ts myfile2.js

Print result as JSON:

deno lint --json

Read from stdin:

cat file.ts | deno lint -
cat file.ts | deno lint --json -

List available rules:

deno lint --rules

To ignore specific diagnostics, you can write an ignore comment on the preceding line with a rule name (or multiple):

// deno-lint-ignore no-explicit-any
// deno-lint-ignore require-await no-empty

To ignore linting on an entire file, you can add an ignore comment at the top of the file:

// deno-lint-ignore-file

Linting options Jump to heading

Output lint result in compact format.

Fix any linting errors for rules that support it.

--ignore<ignore>
Jump to heading

Ignore linting particular source files.

Output lint result in JSON format.

List available rules.

--rules-exclude<rules-exclude>
Jump to heading

Exclude lint rules.

--rules-include<rules-include>
Jump to heading

Include lint rules.

--rules-tags<rules-tags>
Jump to heading

Use set of rules with a tag.

Options Jump to heading

--allow-import, -I<IP_OR_HOSTNAME>optional
Jump to heading

Allow importing from remote hosts. Optionally specify allowed IP addresses and host names, with ports as necessary. Default value: deno.land:443,jsr.io:443,esm.sh:443,raw.esm.sh:443,cdn.jsdelivr.net:443,raw.githubusercontent.com:443,gist.githubusercontent.com:443.

Configure different aspects of deno including TypeScript, linting, and code formatting. Typically the configuration file will be called deno.json or deno.jsonc and automatically detected; in that case this flag is not necessary.

--deny-import<IP_OR_HOSTNAME>optional
Jump to heading

Deny importing from remote hosts. Optionally specify denied IP addresses and host names, with ports as necessary.

Specify the file extension to lint when reading from stdin.For example, use jsx to lint JSX files or tsx for TSX files.This argument is necessary because stdin input does not automatically infer the file type.Example usage: cat file.jsx | deno lint - --ext=jsx.

--no-config
Jump to heading

Disable automatic loading of the configuration file.

--permit-no-files
Jump to heading

Don't return an error code if no files were found.

File watching options Jump to heading

--no-clear-screen
Jump to heading

Do not clear terminal screen when under watch mode.

Watch for file changes and restart process automatically. Only local files from entry point module graph are watched.

--watch-exclude<FILES>optional
Jump to heading

Exclude provided files/patterns from watch mode.

Last updated on

Did you find what you needed?

Privacy policy