jslint-org/jslint

JSLint, The JavaScript Code Quality and Coverage Tool

JavaScript

3,658

1,040 commits

updated Oct 5, 2026

See the code

README

JSLint, The JavaScript Code Quality and Coverage Tool

Douglas Crockford douglas@crockford.com

Status



Web Demo

screenshot



Web Demo Archived



Table of Contents

  1. Quickstart Install

  2. Quickstart Autofix Whitespace

  3. Quickstart JSLint Report

  4. Quickstart V8 Coverage Report

  5. Quickstart JSLint in CodeMirror

  6. Quickstart JSLint in Vim

  7. Quickstart JSLint in VSCode

  8. Documentation

  9. Package Listing

  10. Changelog

  11. License

  12. Devops Instruction



Quickstart Install



To install, just download and save https://www.jslint.com/jslint.mjs to file:

#!/bin/sh

curl -L https://www.jslint.com/jslint.mjs > jslint.mjs
  • shell output

screenshot



To run jslint.mjs in shell:

#!/bin/sh

printf "console.log('hello world');\n" > hello.js

node jslint.mjs hello.js
  • shell output

screenshot



To import jslint.mjs in ES Module environment:

#!/bin/sh

node --input-type=module --eval '

/*jslint devel*/

// Import JSLint in ES Module environment.

import jslint from "./jslint.mjs";

let globals = ["caches", "indexedDb"];
let options = {browser: true};
let result;
let source = "console.log(\u0027hello world\u0027);\n";

// JSLint <source> and print <formatted_message>.

result = jslint.jslint(source, options, globals);
result.warnings.forEach(function ({
    formatted_message
}) {
    console.error(formatted_message);
});

'
  • shell output

screenshot



To import jslint.mjs in CommonJS environment:

#!/bin/sh

node --eval '

/*jslint devel*/
(async function () {
    let globals = ["caches", "indexedDb"];
    let jslint;
    let options = {browser: true};
    let result;
    let source = "console.log(\u0027hello world\u0027);\n";

// Import JSLint in CommonJS environment.

    jslint = await import("./jslint.mjs");
    jslint = jslint.default;

// JSLint <source> and print <formatted_message>.

    result = jslint.jslint(source, options, globals);
    result.warnings.forEach(function ({
        formatted_message
    }) {
        console.error(formatted_message);
    });
}());

'
  • shell output

screenshot



To JSLint entire directory in shell:

#!/bin/sh

# JSLint directory '.'

node jslint.mjs .
  • shell output

screenshot



Quickstart Autofix Whitespace



To autofix whitespace in shell:

#!/bin/sh

printf '
/*jslint devel*/
console.log(
"hello world");
' > hello_autofix.js

node jslint.mjs jslint_autofix=hello_autofix.js

cat hello_autofix.js
  • shell output

screenshot



To autofix whitespace in javascript:

#!/bin/sh

node --input-type=module --eval '

/*jslint devel*/
import jslint from "./jslint.mjs";
let result;
let source = (`
/*jslint devel*/
console.log(
"hello world");
`);

result = jslint.jslint(source, {autofix: true});
console.log(result.autofixed);

'
  • shell output

screenshot



Quickstart JSLint Report



To create a JSLint report in shell:

#!/bin/sh

printf "function foo() {console.log('hello world');}\n" > hello_report.js

# Create JSLint report from file 'hello_report.js' in shell.

node jslint.mjs \
    jslint_report=.artifact/jslint_report_hello.html \
    hello_report.js
  • shell output

screenshot

screenshot



To create a JSLint report in javascript:

#!/bin/sh

node --input-type=module --eval '

/*jslint devel*/
import jslint from "./jslint.mjs";
import fs from "fs";
(async function () {
    let result;
    let source = "function foo() {console.log(\u0027hello world\u0027);}\n";

// Create JSLint report from <source> in javascript.

    result = jslint.jslint(source);
    result = jslint.jslint_report(result);
    result = `<body class="JSLINT_ JSLINT_REPORT_">\n${result}</body>\n`;

    await fs.promises.mkdir(".artifact/", {recursive: true});
    await fs.promises.writeFile(".artifact/jslint_report_hello.html", result);
    console.error("wrote file .artifact/jslint_report_hello.html");
}());

'
  • shell output

screenshot

screenshot



Quickstart V8 Coverage Report



To create V8 coverage report from Node.js / Npm program in shell:

#!/bin/sh

git clone https://github.com/tryghost/node-sqlite3 node-sqlite3-sh \
    --branch=v6.0.1 \
    --depth=1 \
    --single-branch

cd node-sqlite3-sh
npm install

# Create V8 coverage report from program `npm run test` in shell.

node ../jslint.mjs \
    v8_coverage_report=../.artifact/coverage_sqlite3_sh/ \
        --exclude=tes?/ \
        --exclude=tes[!0-9A-Z_a-z-]/ \
        --exclude=tes[0-9A-Z_a-z-]/ \
        --exclude=tes[^0-9A-Z_a-z-]/ \
        --exclude=test/**/*.js \
        --exclude=test/suppor*/*elper.js \
        --exclude=test/suppor?/?elper.js \
        --exclude=test/support/helper.js \
        --include=**/*.cjs \
        --include=**/*.js \
        --include=**/*.mjs \
        --include=li*/*.js \
        --include=li?/*.js \
        --include=lib/ \
        --include=lib/**/*.js \
        --include=lib/*.js \
        --include=lib/sqlite3.js \
    npm run test
  • shell output

screenshot

screenshot

screenshot



To create V8 coverage report from Node.js / Npm program in javascript:

#!/bin/sh

git clone https://github.com/tryghost/node-sqlite3 node-sqlite3-js \
    --branch=v6.0.1 \
    --depth=1 \
    --single-branch

cd node-sqlite3-js
npm install

node --input-type=module --eval '

/*jslint node*/
import jslint from "../jslint.mjs";
(async function () {

// Create V8 coverage report from program `npm run test` in javascript.

    await jslint.v8CoverageReportCreate({
        coverageDir: "../.artifact/coverage_sqlite3_js/",
        processArgv: [
            "--exclude=tes?/",
            "--exclude=tes[!0-9A-Z_a-z-]/",
            "--exclude=tes[0-9A-Z_a-z-]/",
            "--exclude=tes[^0-9A-Z_a-z-]/",
            "--exclude=test/**/*.js",
            "--exclude=test/suppor*/*elper.js",
            "--exclude=test/suppor?/?elper.js",
            "--exclude=test/support/helper.js",
            "--include=**/*.cjs",
            "--include=**/*.js",
            "--include=**/*.mjs",
            "--include=li*/*.js",
            "--include=li?/*.js",
            "--include=lib/",
            "--include=lib/**/*.js",
            "--include=lib/*.js",
            "--include=lib/sqlite3.js",
            "npm", "run", "test"
        ]
    });
}());

'
  • shell output

screenshot

screenshot

screenshot



Quickstart JSLint in CodeMirror

  1. Download and save jslint.mjs, jslint_wrapper_codemirror.js to file.

  2. Edit, save, and serve example html-file below:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>CodeMirror: JSLint Demo</title>

<!-- Assets from codemirror. -->

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.21/codemirror.css" integrity="sha512-7vaQ4LLdaXd2IuMd4MUQ6LRFIGbEwJI1aq6KYqL3RjbdQyUkRFhwZKmqmkBXurTFdGlx687lTN8FSJfX6Df8Gw==" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.21/addon/lint/lint.css" integrity="sha512-rx8Dv9UY+C/6Qsech6A5L2ka9ugVuQfdGlNitUbYtbuEMjfo5JapbOyUOwRAwvl7GmZfYiP5t4qOE5+d8aKgbA==" crossorigin="anonymous">
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.21/codemirror.js" integrity="sha512-ksE4KDA1cKB0p1MTQsoUZ5lpj+KvHOreU76sE+4RsG92LiyIE7gUrnT3Dt+O7CrC2aJzG17UsOh7apakp7lyJw==" crossorigin="anonymous"></script>
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.21/mode/javascript/javascript.js" integrity="sha512-VgqsGo4zxSK9KBf4c3RWpFWkRfBEeIUb2p5VqKtDj7sXdTyTyx38jVVJSriVU12pS5hG5J69FDi/LDsQ5Y1Ldw==" crossorigin="anonymous"></script>
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.21/addon/lint/lint.js" integrity="sha512-HzWWmsisNY6OUHWrNyo4yiHkGs6CUGEwI8Pu+q9tCWkmeWtvWa7D1gHTx9Oj0LQdldSKd4yffFA4PObCeKi9ew==" crossorigin="anonymous"></script>

<!-- Assets from jslint. -->

    <script type="module" src="./jslint.mjs?window_jslint=1"></script>
    <script defer src="./jslint_wrapper_codemirror.js"></script>
<style>
body {
    background: #bbb;
    color: #333;
    font-family: sans-serif;
    margin: 20px;
}
.JSLINT_.JSLINT_REPORT_ {
    margin-top: 20px;
}
#editor1 {
    height: 300px;
    width: 100%;
}
</style>
</head>


<body>
    <h1>CodeMirror: JSLint Demo</h1>
    <h3>
This demo will auto-lint the code below, and auto-generate a report as you type.
    </h3>

<!-- Container for codemirror-editor. -->

    <textarea id="editor1">console.log('hello world');</textarea>

<!-- Container for jslint-report. -->

    <div class="JSLINT_ JSLINT_REPORT_"></div>


<script type=module>
window.addEventListener("load", function () {
    let editor = window.CodeMirror.fromTextArea(document.getElementById(
        "editor1"
    ), {
        gutters: [
            "CodeMirror-lint-markers"
        ],
        indentUnit: 4,
        lineNumbers: true,
        lint: {
            lintOnChange: true, // Enable auto-lint.
            options: {
                // browser: true,
                // node: true
                globals: [
                    // "caches",
                    // "indexedDb"
                ]
            }
        },
        mode: "javascript"
    });

// Initialize event-handling before linter is run.

    editor.on("lintJslintBefore", function (/* options */) {
        // options.browser = true;
        // options.node = true;
        // options.globals = [
        //     "caches",
        //     "indexedDb"
        // ];
        return;
    });

// Initialize event-handling after linter is run.

    editor.on("lintJslintAfter", function (options) {

// Generate jslint-report from options.result.

        document.querySelector(
            ".JSLINT_REPORT_"
        ).innerHTML = window.jslint.jslint_report(options.result);
    });

// Manually trigger linter.

    editor.performLint();
});
</script>
</body>
</html>
  1. Live example at https://www.jslint.com/jslint_wrapper_codemirror.html

screenshot



Quickstart JSLint in Vim

  1. Download and save jslint.mjs, jslint_wrapper_vim.vim to directory ~/.vim/
  2. Add vim-command :source ~/.vim/jslint_wrapper_vim.vim to file ~/.vimrc
    • If above files were saved to custom-directory, then use that directory instead, e.g.:
  3. Vim can now jslint files (via nodejs):
    • with vim-command :SaveAndJslint
    • with vim-key-combo <Ctrl-S> <Ctrl-J>
  • screenshot

screenshot



Quickstart JSLint in VSCode

  1. In VSCode, search and install extension vscode-jslint
  2. In VSCode, while editing a javascript file:
    • right-click context-menu and select [JSLint - Lint File]
    • or use key-binding [Ctrl + Shift + J], [L]
    • or use key-binding [Cmd + Shift + J], [L] for Mac
  3. In VSCode, to autofix whitespace in file:
    • right-click context-menu and select [JSLint - Autofix Whitespace]
    • or use key-binding [Ctrl + Shift + J], [A]
    • or use key-binding [Cmd + Shift + J], [A] for Mac
  • screenshot

screenshot



Documentation

  • jslint.mjs contains the jslint function. It parses and analyzes a source file, returning an object with information about the file. It can also take an object that sets options.
  • index.html runs the jslint.mjs function in a web page.



API Doc

screenshot



Directive


/*jslint*/

  • /*jslint beta*/
/*jslint beta*/
// Enable experimental warnings.
// Warn if global variables are redefined.
// Warn if const / let statements are not declared at top of function or
//    script, similar to var statements.
// Warn if const / let / var statements are not declared in ascii-order.
// Warn if named-functions are not declared in ascii-order.
// Warn if cases in switch-statements are not in ascii-order.

  • /*jslint bitwise*/
/*jslint bitwise*/
// Allow bitwise operator.

String(0 | 1);

  • /*jslint browser*/
/*jslint browser*/
// Assume browser environment.

localStorage.getItem("foo");

  • /*jslint convert*/
/*jslint convert*/
// Allow conversion operator.

String(new Date() + "");
String(!!0);

  • /*jslint couch*/
/*jslint couch*/
// Assume CouchDb environment.

registerType("text-json", "text/json");

  • /*jslint devel*/
/*jslint devel*/
// Allow console.log() and friends.

console.log("hello");

  • /*jslint eval*/
/*jslint eval*/
// Allow eval().

eval("1");

  • /*jslint fart*/
/*jslint fart*/
// Allow complex fat-arrow.

const foo = async ({bar, baz}) => {
    return await bar(baz);
};
await foo();

  • /*jslint getset*/
/*jslint getset, this, devel*/
// Allow get() and set().

let foo = {
    bar: 0,
    get getBar() {
        return this.bar;
    },
    set setBar(value) {
        this.bar = value;
    }
};
console.log(foo.getBar); // 0
foo.setBar = 1;
console.log(foo.getBar); // 1

  • /*jslint indent2*/
/*jslint indent2*/
// Use 2-space indent.

String(
  "hello"
);

  • /*jslint long*/
/*jslint long*/
// Allow long lines.

String("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

  • /*jslint node*/
/*jslint node*/
// Assume Node.js environment.

require("fs");

  • /*jslint nomen*/
/*jslint nomen*/
// Allow weird property name.

let foo = {};
foo._bar = 1;

  • /*jslint single*/
/*jslint single*/
// Allow single-quote strings.

String('hello');

  • /*jslint subscript*/
/*jslint subscript*/
// Allow identifiers in subscript-notation.

let foo = {};
foo["bar"] = 1;

  • /*jslint this*/
/*jslint this*/
// Allow 'this'.

function foo() {
    return this;
}
foo();

  • /*jslint trace*/
/*jslint trace*/
// Include jslint stack-trace in warnings.

console.log('hello world');
/*
1. Undeclared 'console'.
console.log('hello world');
Error
    at warn_at (...)
    at warn (...)
    at lookup (...)
    at pre_v (...)
    at jslint.mjs
2. Use double quotes, not single quotes.
console.log(...);
Error
    at warn_at (...)
    at lex_string (...)
    at lex_token (...)
    at jslint_phase2_lex (...)
    at Function.jslint (...)
    at jslint.mjs
*/

  • /*jslint unordered*/
/*jslint unordered*/
// Allow unordered cases, params, properties, variables, and exports.

let foo = {bb: 1, aa: 0};

function bar({
    bb = 1,
    aa = 0
}) {
    return aa + bb;
}

export {
    foo,
    bar
};

  • /*jslint variable*/
/*jslint variable*/
// Allow unordered const and let declarations not at top of function-scope.

let aa = "hello";
String(aa);
let bb = "goodbye";
String(bb);

  • /*jslint white*/
/*jslint white*/
// Allow messy whitespace.

String(
"hello"
);

/*global*/
/*global foo, bar*/
// Declare global variables foo, bar.

foo();
bar();

/*property*/
/*property foo, bar*/
// Restrict property-access to only .foo, .bar.

String({bar: 1, foo: 2});

/*jslint-disable*/ ... /*jslint-enable*/
/*jslint-disable*/

JSLint will ignore and treat this region as blank-lines.
Syntax error.

/*jslint-enable*/

//jslint-ignore-line
// JSLint will ignore non-fatal warnings at given line.

eval("1"); //jslint-ignore-line

/*coverage-disable*/ ... /*coverage-enable*/
/*coverage-disable*/

// JSLint will ignore code-coverage in this region.

if (false) {
    console.log("hello world");
}

/*coverage-enable*/

//coverage-ignore-line
// JSLint will ignore code-coverage at given line.

if (false) {
    console.log("hello world"); //coverage-ignore-line
}



ECMAScript Feature Support

#.JSLint SupportES VersionES Feature
99.❌ES2027Explicit Resource Management
98.✅ES2027Atomics.pause
97.❌ES2027Joint Iteration
96.✅ES2027Temporal
95.✅ES2026Upsert
94.✅ES2026JSON.parse source text access
93.❌ES2026Iterator Sequencing
92.✅ES2026Uint8Array to/from Base64
91.✅ES2026Math.sumPrecise
90.✅ES2026Error.isError
89.✅ES2026Array.fromAsync
88.✅ES2025RegExp.escape
87.✅ES2025Redeclarable global eval-introduced vars
86.✅ES2025Float16 on TypedArrays, DataView, Math.f16round
85.✅ES2025Promise.try
84.❌ES2025Sync Iterator helpers
83.✅ES2025JSON Modules
82.✅ES2025Import Attributes
81.✅ES2025RegExp Modifiers
80.✅ES2025New Set methods
79.✅ES2025Duplicate named capture groups
78.✅ES2024ArrayBuffer transfer
77.✅ES2024Promise.withResolvers
76.✅ES2024Array Grouping
75.✅ES2024Resizable and growable ArrayBuffers
74.⚠️ES2024RegExp v flag with set notation + properties of strings
73.✅ES2024Atomics.waitAsync
72.✅ES2024Well-Formed Unicode Strings
71.✅ES2023Change Array by Copy
70.✅ES2023Symbols as WeakMap keys
69.✅ES2023Hashbang Grammar
68.✅ES2023Array find from last
67.✅ES2022Error Cause
66.❌ES2022Class Static Block
65.✅ES2022Accessible Object.prototype.hasOwnProperty
64.✅ES2022.at()
63.❌ES2022Ergonomic brand checks for Private Fields
62.✅ES2022Top-level await
61.✅ES2022RegExp Match Indices
60.❌ES2022Class Public Instance Fields & Private Instance Fields
59.✅ES2021Numeric separators
58.✅ES2021Logical Assignment Operators
57.✅ES2021WeakRefs
56.✅ES2021Promise.any
55.✅ES2021String.prototype.replaceAll
54.✅ES2020import.meta
53.✅ES2020Nullish coalescing Operator
52.✅ES2020Optional Chaining
51.✅ES2020for-in mechanics
50.✅ES2020globalThis
49.✅ES2020Promise.allSettled
48.✅ES2020BigInt
47.✅ES2020import()
46.✅ES2020String.prototype.matchAll
45.✅ES2019Array.prototype.{flat,flatMap}
44.✅ES2019String.prototype.{trimStart,trimEnd}
43.✅ES2019Well-formed JSON.stringify
42.✅ES2019Object.fromEntries
41.✅ES2019Function.prototype.toString revision
40.✅ES2019Symbol.prototype.description
39.✅ES2019JSON superset
38.✅ES2019Optional catch binding
37.⚠️ES2018Asynchronous Iteration
36.✅ES2018Promise.prototype.finally
35.✅ES2018RegExp Unicode Property Escapes
34.✅ES2018RegExp Lookbehind Assertions
33.✅ES2018Rest/Spread Properties
32.✅ES2018RegExp named capture groups
31.✅ES2018s (dotAll) flag for regular expressions
30.✅ES2018Lifting template literal restriction
29.✅ES2017Shared memory and atomics
28.✅ES2017Async functions
27.⚠️ES2017Trailing commas in function parameter lists and calls
26.✅ES2017Object.getOwnPropertyDescriptors
25.✅ES2017String padding
24.✅ES2017Object.values/Object.entries
23.✅ES2016Exponentiation operator
22.✅ES2016Array.prototype.includes
21.✅ES2015arrows
20.❌ES2015classes
19.❌ES2015enhanced object literals
18.✅ES2015template strings
17.✅ES2015destructuring
16.✅ES2015default + rest + spread
15.✅ES2015let + const
14.⚠️ES2015iterators + for..of
13.❌ES2015generators
12.✅ES2015unicode
11.⚠️ES2015modules
10.✅ES2015module loaders
9.✅ES2015map + set + weakmap + weakset
8.✅ES2015proxies
7.✅ES2015symbols
6.❌ES2015subclassable built-ins
5.✅ES2015promises
4.✅ES2015math + number + string + array + object APIs
3.✅ES2015binary and octal literals
2.✅ES2015reflect api
1.✅ES2015tail calls



Package Listing

screenshot_package_listing.svg



Changelog

screenshot_changelog.svg



License



Devops Instruction



pull-request merge

  1. update .github/workflows/ci.yml .github/workflows/publish.yml to:

  2. update CHANGELOG.md

  3. goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-p20yy.mm.dd

    • click Create pull request
    • input Add a title * with: <CHANGELOG.md entry #1>
    • input Add a description with:
      Fixes #xxx.
      
      This PR will:
      <CHANGELOG.md entry #1>
      
      This PR will additionally:
      <CHANGELOG.md entry extra>
      
      <screenshot>
      
    • click Preview and review
    • verify:
      • base respository: jslint-org/jslint
      • base: beta
    • click Create pull request
  4. wait awhile before continuing ...



branch-master commit

  1. update .github/workflows/ci.yml .github/workflows/publish.yml to:

  2. update CHANGELOG.md

  3. goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-v20yy.mm.dd

  4. wait awhile before continuing ...



branch-master publish

  1. goto https://www.npmjs.com/package/@jslint-org/jslint/access
    • click Github Actions
    • input Organization or user* with: jslint-org
    • input Repository* with: jslint
    • input Workflow filename* with: publish.yml
    • click Set up connection or Update Package Settings
  2. goto https://github.com/jslint-org/jslint/releases/new
    • input Tag: Select tag with: v20yy.mm.dd
      • click Create new tag and click Create
      • verify correct-year v20yy.mm.dd
      • select Target: master
    • input Release title with: v20yy.mm.dd - <CHANGELOG.md entry #1>
      • select Previous tag: Auto
      • click Generate release notes
    • input Write with:
      <CHANGELOG.md entry #1>
      <CHANGELOG.md entry extra>
      
      **Full Changelog**: ...
      
    • click Preview and review
    • click Latest
    • click Publish release



vscode-jslint qa


# build vscode-jslint
sh jslint_ci.sh shCiVscePackageJslintWrapperVscode

# open vscode and debug
code \
    --disable-extensions \
    --extensionDevelopmentPath=\
'C:\Users\<username>\Documents\jslint\.artifact\jslint_wrapper_vscode'



vscode-jslint publish

  1. goto https://github.com/jslint-org/jslint/tree/gh-pages/branch-beta/.artifact/jslint_wrapper_vscode
    • click vscode-jslint-20yy.mm.dd.vsix
    • click Raw to download
  2. goto https://marketplace.visualstudio.com/manage/publishers/jslint
    • move mouse to version-number, right-click, and select Update
    • upload downloaded file vscode-jslint-20yy.mm.dd.vsix
    • click 'Upload'
      • verify email-notification [Succeeded] Extension publish on Visual Studio Marketplace - vscode-jslint
coverage-report
javascript
jslint
zero-config
zero-dependency

jslint-org/jslint

JSLint, The JavaScript Code Quality and Coverage Tool

JavaScript

3,658

1,040 commits

updated Oct 5, 2026

See the code

README

JSLint, The JavaScript Code Quality and Coverage Tool

Douglas Crockford douglas@crockford.com

Status



Web Demo

screenshot



Web Demo Archived



Table of Contents

  1. Quickstart Install

  2. Quickstart Autofix Whitespace

  3. Quickstart JSLint Report

  4. Quickstart V8 Coverage Report

  5. Quickstart JSLint in CodeMirror

  6. Quickstart JSLint in Vim

  7. Quickstart JSLint in VSCode

  8. Documentation

  9. Package Listing

  10. Changelog

  11. License

  12. Devops Instruction



Quickstart Install



To install, just download and save https://www.jslint.com/jslint.mjs to file:

#!/bin/sh

curl -L https://www.jslint.com/jslint.mjs > jslint.mjs
  • shell output

screenshot



To run jslint.mjs in shell:

#!/bin/sh

printf "console.log('hello world');\n" > hello.js

node jslint.mjs hello.js
  • shell output

screenshot



To import jslint.mjs in ES Module environment:

#!/bin/sh

node --input-type=module --eval '

/*jslint devel*/

// Import JSLint in ES Module environment.

import jslint from "./jslint.mjs";

let globals = ["caches", "indexedDb"];
let options = {browser: true};
let result;
let source = "console.log(\u0027hello world\u0027);\n";

// JSLint <source> and print <formatted_message>.

result = jslint.jslint(source, options, globals);
result.warnings.forEach(function ({
    formatted_message
}) {
    console.error(formatted_message);
});

'
  • shell output

screenshot



To import jslint.mjs in CommonJS environment:

#!/bin/sh

node --eval '

/*jslint devel*/
(async function () {
    let globals = ["caches", "indexedDb"];
    let jslint;
    let options = {browser: true};
    let result;
    let source = "console.log(\u0027hello world\u0027);\n";

// Import JSLint in CommonJS environment.

    jslint = await import("./jslint.mjs");
    jslint = jslint.default;

// JSLint <source> and print <formatted_message>.

    result = jslint.jslint(source, options, globals);
    result.warnings.forEach(function ({
        formatted_message
    }) {
        console.error(formatted_message);
    });
}());

'
  • shell output

screenshot



To JSLint entire directory in shell:

#!/bin/sh

# JSLint directory '.'

node jslint.mjs .
  • shell output

screenshot



Quickstart Autofix Whitespace



To autofix whitespace in shell:

#!/bin/sh

printf '
/*jslint devel*/
console.log(
"hello world");
' > hello_autofix.js

node jslint.mjs jslint_autofix=hello_autofix.js

cat hello_autofix.js
  • shell output

screenshot



To autofix whitespace in javascript:

#!/bin/sh

node --input-type=module --eval '

/*jslint devel*/
import jslint from "./jslint.mjs";
let result;
let source = (`
/*jslint devel*/
console.log(
"hello world");
`);

result = jslint.jslint(source, {autofix: true});
console.log(result.autofixed);

'
  • shell output

screenshot



Quickstart JSLint Report



To create a JSLint report in shell:

#!/bin/sh

printf "function foo() {console.log('hello world');}\n" > hello_report.js

# Create JSLint report from file 'hello_report.js' in shell.

node jslint.mjs \
    jslint_report=.artifact/jslint_report_hello.html \
    hello_report.js
  • shell output

screenshot

screenshot



To create a JSLint report in javascript:

#!/bin/sh

node --input-type=module --eval '

/*jslint devel*/
import jslint from "./jslint.mjs";
import fs from "fs";
(async function () {
    let result;
    let source = "function foo() {console.log(\u0027hello world\u0027);}\n";

// Create JSLint report from <source> in javascript.

    result = jslint.jslint(source);
    result = jslint.jslint_report(result);
    result = `<body class="JSLINT_ JSLINT_REPORT_">\n${result}</body>\n`;

    await fs.promises.mkdir(".artifact/", {recursive: true});
    await fs.promises.writeFile(".artifact/jslint_report_hello.html", result);
    console.error("wrote file .artifact/jslint_report_hello.html");
}());

'
  • shell output

screenshot

screenshot



Quickstart V8 Coverage Report



To create V8 coverage report from Node.js / Npm program in shell:

#!/bin/sh

git clone https://github.com/tryghost/node-sqlite3 node-sqlite3-sh \
    --branch=v6.0.1 \
    --depth=1 \
    --single-branch

cd node-sqlite3-sh
npm install

# Create V8 coverage report from program `npm run test` in shell.

node ../jslint.mjs \
    v8_coverage_report=../.artifact/coverage_sqlite3_sh/ \
        --exclude=tes?/ \
        --exclude=tes[!0-9A-Z_a-z-]/ \
        --exclude=tes[0-9A-Z_a-z-]/ \
        --exclude=tes[^0-9A-Z_a-z-]/ \
        --exclude=test/**/*.js \
        --exclude=test/suppor*/*elper.js \
        --exclude=test/suppor?/?elper.js \
        --exclude=test/support/helper.js \
        --include=**/*.cjs \
        --include=**/*.js \
        --include=**/*.mjs \
        --include=li*/*.js \
        --include=li?/*.js \
        --include=lib/ \
        --include=lib/**/*.js \
        --include=lib/*.js \
        --include=lib/sqlite3.js \
    npm run test
  • shell output

screenshot

screenshot

screenshot



To create V8 coverage report from Node.js / Npm program in javascript:

#!/bin/sh

git clone https://github.com/tryghost/node-sqlite3 node-sqlite3-js \
    --branch=v6.0.1 \
    --depth=1 \
    --single-branch

cd node-sqlite3-js
npm install

node --input-type=module --eval '

/*jslint node*/
import jslint from "../jslint.mjs";
(async function () {

// Create V8 coverage report from program `npm run test` in javascript.

    await jslint.v8CoverageReportCreate({
        coverageDir: "../.artifact/coverage_sqlite3_js/",
        processArgv: [
            "--exclude=tes?/",
            "--exclude=tes[!0-9A-Z_a-z-]/",
            "--exclude=tes[0-9A-Z_a-z-]/",
            "--exclude=tes[^0-9A-Z_a-z-]/",
            "--exclude=test/**/*.js",
            "--exclude=test/suppor*/*elper.js",
            "--exclude=test/suppor?/?elper.js",
            "--exclude=test/support/helper.js",
            "--include=**/*.cjs",
            "--include=**/*.js",
            "--include=**/*.mjs",
            "--include=li*/*.js",
            "--include=li?/*.js",
            "--include=lib/",
            "--include=lib/**/*.js",
            "--include=lib/*.js",
            "--include=lib/sqlite3.js",
            "npm", "run", "test"
        ]
    });
}());

'
  • shell output

screenshot

screenshot

screenshot



Quickstart JSLint in CodeMirror

  1. Download and save jslint.mjs, jslint_wrapper_codemirror.js to file.

  2. Edit, save, and serve example html-file below:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>CodeMirror: JSLint Demo</title>

<!-- Assets from codemirror. -->

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.21/codemirror.css" integrity="sha512-7vaQ4LLdaXd2IuMd4MUQ6LRFIGbEwJI1aq6KYqL3RjbdQyUkRFhwZKmqmkBXurTFdGlx687lTN8FSJfX6Df8Gw==" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.21/addon/lint/lint.css" integrity="sha512-rx8Dv9UY+C/6Qsech6A5L2ka9ugVuQfdGlNitUbYtbuEMjfo5JapbOyUOwRAwvl7GmZfYiP5t4qOE5+d8aKgbA==" crossorigin="anonymous">
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.21/codemirror.js" integrity="sha512-ksE4KDA1cKB0p1MTQsoUZ5lpj+KvHOreU76sE+4RsG92LiyIE7gUrnT3Dt+O7CrC2aJzG17UsOh7apakp7lyJw==" crossorigin="anonymous"></script>
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.21/mode/javascript/javascript.js" integrity="sha512-VgqsGo4zxSK9KBf4c3RWpFWkRfBEeIUb2p5VqKtDj7sXdTyTyx38jVVJSriVU12pS5hG5J69FDi/LDsQ5Y1Ldw==" crossorigin="anonymous"></script>
    <script defer src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.21/addon/lint/lint.js" integrity="sha512-HzWWmsisNY6OUHWrNyo4yiHkGs6CUGEwI8Pu+q9tCWkmeWtvWa7D1gHTx9Oj0LQdldSKd4yffFA4PObCeKi9ew==" crossorigin="anonymous"></script>

<!-- Assets from jslint. -->

    <script type="module" src="./jslint.mjs?window_jslint=1"></script>
    <script defer src="./jslint_wrapper_codemirror.js"></script>
<style>
body {
    background: #bbb;
    color: #333;
    font-family: sans-serif;
    margin: 20px;
}
.JSLINT_.JSLINT_REPORT_ {
    margin-top: 20px;
}
#editor1 {
    height: 300px;
    width: 100%;
}
</style>
</head>


<body>
    <h1>CodeMirror: JSLint Demo</h1>
    <h3>
This demo will auto-lint the code below, and auto-generate a report as you type.
    </h3>

<!-- Container for codemirror-editor. -->

    <textarea id="editor1">console.log('hello world');</textarea>

<!-- Container for jslint-report. -->

    <div class="JSLINT_ JSLINT_REPORT_"></div>


<script type=module>
window.addEventListener("load", function () {
    let editor = window.CodeMirror.fromTextArea(document.getElementById(
        "editor1"
    ), {
        gutters: [
            "CodeMirror-lint-markers"
        ],
        indentUnit: 4,
        lineNumbers: true,
        lint: {
            lintOnChange: true, // Enable auto-lint.
            options: {
                // browser: true,
                // node: true
                globals: [
                    // "caches",
                    // "indexedDb"
                ]
            }
        },
        mode: "javascript"
    });

// Initialize event-handling before linter is run.

    editor.on("lintJslintBefore", function (/* options */) {
        // options.browser = true;
        // options.node = true;
        // options.globals = [
        //     "caches",
        //     "indexedDb"
        // ];
        return;
    });

// Initialize event-handling after linter is run.

    editor.on("lintJslintAfter", function (options) {

// Generate jslint-report from options.result.

        document.querySelector(
            ".JSLINT_REPORT_"
        ).innerHTML = window.jslint.jslint_report(options.result);
    });

// Manually trigger linter.

    editor.performLint();
});
</script>
</body>
</html>
  1. Live example at https://www.jslint.com/jslint_wrapper_codemirror.html

screenshot



Quickstart JSLint in Vim

  1. Download and save jslint.mjs, jslint_wrapper_vim.vim to directory ~/.vim/
  2. Add vim-command :source ~/.vim/jslint_wrapper_vim.vim to file ~/.vimrc
    • If above files were saved to custom-directory, then use that directory instead, e.g.:
  3. Vim can now jslint files (via nodejs):
    • with vim-command :SaveAndJslint
    • with vim-key-combo <Ctrl-S> <Ctrl-J>
  • screenshot

screenshot



Quickstart JSLint in VSCode

  1. In VSCode, search and install extension vscode-jslint
  2. In VSCode, while editing a javascript file:
    • right-click context-menu and select [JSLint - Lint File]
    • or use key-binding [Ctrl + Shift + J], [L]
    • or use key-binding [Cmd + Shift + J], [L] for Mac
  3. In VSCode, to autofix whitespace in file:
    • right-click context-menu and select [JSLint - Autofix Whitespace]
    • or use key-binding [Ctrl + Shift + J], [A]
    • or use key-binding [Cmd + Shift + J], [A] for Mac
  • screenshot

screenshot



Documentation

  • jslint.mjs contains the jslint function. It parses and analyzes a source file, returning an object with information about the file. It can also take an object that sets options.
  • index.html runs the jslint.mjs function in a web page.



API Doc

screenshot



Directive


/*jslint*/

  • /*jslint beta*/
/*jslint beta*/
// Enable experimental warnings.
// Warn if global variables are redefined.
// Warn if const / let statements are not declared at top of function or
//    script, similar to var statements.
// Warn if const / let / var statements are not declared in ascii-order.
// Warn if named-functions are not declared in ascii-order.
// Warn if cases in switch-statements are not in ascii-order.

  • /*jslint bitwise*/
/*jslint bitwise*/
// Allow bitwise operator.

String(0 | 1);

  • /*jslint browser*/
/*jslint browser*/
// Assume browser environment.

localStorage.getItem("foo");

  • /*jslint convert*/
/*jslint convert*/
// Allow conversion operator.

String(new Date() + "");
String(!!0);

  • /*jslint couch*/
/*jslint couch*/
// Assume CouchDb environment.

registerType("text-json", "text/json");

  • /*jslint devel*/
/*jslint devel*/
// Allow console.log() and friends.

console.log("hello");

  • /*jslint eval*/
/*jslint eval*/
// Allow eval().

eval("1");

  • /*jslint fart*/
/*jslint fart*/
// Allow complex fat-arrow.

const foo = async ({bar, baz}) => {
    return await bar(baz);
};
await foo();

  • /*jslint getset*/
/*jslint getset, this, devel*/
// Allow get() and set().

let foo = {
    bar: 0,
    get getBar() {
        return this.bar;
    },
    set setBar(value) {
        this.bar = value;
    }
};
console.log(foo.getBar); // 0
foo.setBar = 1;
console.log(foo.getBar); // 1

  • /*jslint indent2*/
/*jslint indent2*/
// Use 2-space indent.

String(
  "hello"
);

  • /*jslint long*/
/*jslint long*/
// Allow long lines.

String("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

  • /*jslint node*/
/*jslint node*/
// Assume Node.js environment.

require("fs");

  • /*jslint nomen*/
/*jslint nomen*/
// Allow weird property name.

let foo = {};
foo._bar = 1;

  • /*jslint single*/
/*jslint single*/
// Allow single-quote strings.

String('hello');

  • /*jslint subscript*/
/*jslint subscript*/
// Allow identifiers in subscript-notation.

let foo = {};
foo["bar"] = 1;

  • /*jslint this*/
/*jslint this*/
// Allow 'this'.

function foo() {
    return this;
}
foo();

  • /*jslint trace*/
/*jslint trace*/
// Include jslint stack-trace in warnings.

console.log('hello world');
/*
1. Undeclared 'console'.
console.log('hello world');
Error
    at warn_at (...)
    at warn (...)
    at lookup (...)
    at pre_v (...)
    at jslint.mjs
2. Use double quotes, not single quotes.
console.log(...);
Error
    at warn_at (...)
    at lex_string (...)
    at lex_token (...)
    at jslint_phase2_lex (...)
    at Function.jslint (...)
    at jslint.mjs
*/

  • /*jslint unordered*/
/*jslint unordered*/
// Allow unordered cases, params, properties, variables, and exports.

let foo = {bb: 1, aa: 0};

function bar({
    bb = 1,
    aa = 0
}) {
    return aa + bb;
}

export {
    foo,
    bar
};

  • /*jslint variable*/
/*jslint variable*/
// Allow unordered const and let declarations not at top of function-scope.

let aa = "hello";
String(aa);
let bb = "goodbye";
String(bb);

  • /*jslint white*/
/*jslint white*/
// Allow messy whitespace.

String(
"hello"
);

/*global*/
/*global foo, bar*/
// Declare global variables foo, bar.

foo();
bar();

/*property*/
/*property foo, bar*/
// Restrict property-access to only .foo, .bar.

String({bar: 1, foo: 2});

/*jslint-disable*/ ... /*jslint-enable*/
/*jslint-disable*/

JSLint will ignore and treat this region as blank-lines.
Syntax error.

/*jslint-enable*/

//jslint-ignore-line
// JSLint will ignore non-fatal warnings at given line.

eval("1"); //jslint-ignore-line

/*coverage-disable*/ ... /*coverage-enable*/
/*coverage-disable*/

// JSLint will ignore code-coverage in this region.

if (false) {
    console.log("hello world");
}

/*coverage-enable*/

//coverage-ignore-line
// JSLint will ignore code-coverage at given line.

if (false) {
    console.log("hello world"); //coverage-ignore-line
}



ECMAScript Feature Support

#.JSLint SupportES VersionES Feature
99.❌ES2027Explicit Resource Management
98.✅ES2027Atomics.pause
97.❌ES2027Joint Iteration
96.✅ES2027Temporal
95.✅ES2026Upsert
94.✅ES2026JSON.parse source text access
93.❌ES2026Iterator Sequencing
92.✅ES2026Uint8Array to/from Base64
91.✅ES2026Math.sumPrecise
90.✅ES2026Error.isError
89.✅ES2026Array.fromAsync
88.✅ES2025RegExp.escape
87.✅ES2025Redeclarable global eval-introduced vars
86.✅ES2025Float16 on TypedArrays, DataView, Math.f16round
85.✅ES2025Promise.try
84.❌ES2025Sync Iterator helpers
83.✅ES2025JSON Modules
82.✅ES2025Import Attributes
81.✅ES2025RegExp Modifiers
80.✅ES2025New Set methods
79.✅ES2025Duplicate named capture groups
78.✅ES2024ArrayBuffer transfer
77.✅ES2024Promise.withResolvers
76.✅ES2024Array Grouping
75.✅ES2024Resizable and growable ArrayBuffers
74.⚠️ES2024RegExp v flag with set notation + properties of strings
73.✅ES2024Atomics.waitAsync
72.✅ES2024Well-Formed Unicode Strings
71.✅ES2023Change Array by Copy
70.✅ES2023Symbols as WeakMap keys
69.✅ES2023Hashbang Grammar
68.✅ES2023Array find from last
67.✅ES2022Error Cause
66.❌ES2022Class Static Block
65.✅ES2022Accessible Object.prototype.hasOwnProperty
64.✅ES2022.at()
63.❌ES2022Ergonomic brand checks for Private Fields
62.✅ES2022Top-level await
61.✅ES2022RegExp Match Indices
60.❌ES2022Class Public Instance Fields & Private Instance Fields
59.✅ES2021Numeric separators
58.✅ES2021Logical Assignment Operators
57.✅ES2021WeakRefs
56.✅ES2021Promise.any
55.✅ES2021String.prototype.replaceAll
54.✅ES2020import.meta
53.✅ES2020Nullish coalescing Operator
52.✅ES2020Optional Chaining
51.✅ES2020for-in mechanics
50.✅ES2020globalThis
49.✅ES2020Promise.allSettled
48.✅ES2020BigInt
47.✅ES2020import()
46.✅ES2020String.prototype.matchAll
45.✅ES2019Array.prototype.{flat,flatMap}
44.✅ES2019String.prototype.{trimStart,trimEnd}
43.✅ES2019Well-formed JSON.stringify
42.✅ES2019Object.fromEntries
41.✅ES2019Function.prototype.toString revision
40.✅ES2019Symbol.prototype.description
39.✅ES2019JSON superset
38.✅ES2019Optional catch binding
37.⚠️ES2018Asynchronous Iteration
36.✅ES2018Promise.prototype.finally
35.✅ES2018RegExp Unicode Property Escapes
34.✅ES2018RegExp Lookbehind Assertions
33.✅ES2018Rest/Spread Properties
32.✅ES2018RegExp named capture groups
31.✅ES2018s (dotAll) flag for regular expressions
30.✅ES2018Lifting template literal restriction
29.✅ES2017Shared memory and atomics
28.✅ES2017Async functions
27.⚠️ES2017Trailing commas in function parameter lists and calls
26.✅ES2017Object.getOwnPropertyDescriptors
25.✅ES2017String padding
24.✅ES2017Object.values/Object.entries
23.✅ES2016Exponentiation operator
22.✅ES2016Array.prototype.includes
21.✅ES2015arrows
20.❌ES2015classes
19.❌ES2015enhanced object literals
18.✅ES2015template strings
17.✅ES2015destructuring
16.✅ES2015default + rest + spread
15.✅ES2015let + const
14.⚠️ES2015iterators + for..of
13.❌ES2015generators
12.✅ES2015unicode
11.⚠️ES2015modules
10.✅ES2015module loaders
9.✅ES2015map + set + weakmap + weakset
8.✅ES2015proxies
7.✅ES2015symbols
6.❌ES2015subclassable built-ins
5.✅ES2015promises
4.✅ES2015math + number + string + array + object APIs
3.✅ES2015binary and octal literals
2.✅ES2015reflect api
1.✅ES2015tail calls



Package Listing

screenshot_package_listing.svg



Changelog

screenshot_changelog.svg



License



Devops Instruction



pull-request merge

  1. update .github/workflows/ci.yml .github/workflows/publish.yml to:

  2. update CHANGELOG.md

  3. goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-p20yy.mm.dd

    • click Create pull request
    • input Add a title * with: <CHANGELOG.md entry #1>
    • input Add a description with:
      Fixes #xxx.
      
      This PR will:
      <CHANGELOG.md entry #1>
      
      This PR will additionally:
      <CHANGELOG.md entry extra>
      
      <screenshot>
      
    • click Preview and review
    • verify:
      • base respository: jslint-org/jslint
      • base: beta
    • click Create pull request
  4. wait awhile before continuing ...



branch-master commit

  1. update .github/workflows/ci.yml .github/workflows/publish.yml to:

  2. update CHANGELOG.md

  3. goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-v20yy.mm.dd

  4. wait awhile before continuing ...



branch-master publish

  1. goto https://www.npmjs.com/package/@jslint-org/jslint/access
    • click Github Actions
    • input Organization or user* with: jslint-org
    • input Repository* with: jslint
    • input Workflow filename* with: publish.yml
    • click Set up connection or Update Package Settings
  2. goto https://github.com/jslint-org/jslint/releases/new
    • input Tag: Select tag with: v20yy.mm.dd
      • click Create new tag and click Create
      • verify correct-year v20yy.mm.dd
      • select Target: master
    • input Release title with: v20yy.mm.dd - <CHANGELOG.md entry #1>
      • select Previous tag: Auto
      • click Generate release notes
    • input Write with:
      <CHANGELOG.md entry #1>
      <CHANGELOG.md entry extra>
      
      **Full Changelog**: ...
      
    • click Preview and review
    • click Latest
    • click Publish release



vscode-jslint qa


# build vscode-jslint
sh jslint_ci.sh shCiVscePackageJslintWrapperVscode

# open vscode and debug
code \
    --disable-extensions \
    --extensionDevelopmentPath=\
'C:\Users\<username>\Documents\jslint\.artifact\jslint_wrapper_vscode'



vscode-jslint publish

  1. goto https://github.com/jslint-org/jslint/tree/gh-pages/branch-beta/.artifact/jslint_wrapper_vscode
    • click vscode-jslint-20yy.mm.dd.vsix
    • click Raw to download
  2. goto https://marketplace.visualstudio.com/manage/publishers/jslint
    • move mouse to version-number, right-click, and select Update
    • upload downloaded file vscode-jslint-20yy.mm.dd.vsix
    • click 'Upload'
      • verify email-notification [Succeeded] Extension publish on Visual Studio Marketplace - vscode-jslint
coverage-report
javascript
jslint
zero-config
zero-dependency

Project health

Latest release

2026.9.29 · Oct 5, 2026

Releases this year

8

Significant stargazers

(top 24 of 27)

Andreas Lind

131 followers · starred Nov 2010

Luke Page

264 followers · starred Nov 2010

Mike West

816 followers · starred Nov 2010

Norio NOMURA

292 followers · starred Nov 2010