JSLint, The JavaScript Code Quality and Coverage Tool
See the codeDouglas Crockford douglas@crockford.com
| Branch | master (v2026.9.29) | beta (Web Demo) | alpha (Development) |
|---|---|---|---|
| CI | |||
| Coverage | |||
| Demo | |||
| Artifacts |
#!/bin/sh
curl -L https://www.jslint.com/jslint.mjs > jslint.mjs
jslint.mjs in shell:#!/bin/sh
printf "console.log('hello world');\n" > hello.js
node jslint.mjs hello.js
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);
});
'
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);
});
}());
'
#!/bin/sh
# JSLint directory '.'
node jslint.mjs .
#!/bin/sh
printf '
/*jslint devel*/
console.log(
"hello world");
' > hello_autofix.js
node jslint.mjs jslint_autofix=hello_autofix.js
cat hello_autofix.js
#!/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);
'
#!/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
#!/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");
}());
'
#!/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
#!/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"
]
});
}());
'
Download and save jslint.mjs, jslint_wrapper_codemirror.js to file.
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>
jslint.mjs, jslint_wrapper_vim.vim to directory ~/.vim/:source ~/.vim/jslint_wrapper_vim.vim to file ~/.vimrc
jslint.mjs, jslint_wrapper_vim.vim to directory ~/vimfiles/:source ~/vimfiles/jslint_wrapper_vim.vim:SaveAndJslint<Ctrl-S> <Ctrl-J>vscode-jslint[JSLint - Lint File][Ctrl + Shift + J], [L][Cmd + Shift + J], [L] for Mac[JSLint - Autofix Whitespace][Ctrl + Shift + J], [A][Cmd + Shift + J], [A] for Mac/*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
}
v8CoverageListMerge is derived from MIT Licensed v8-coverage.update .github/workflows/ci.yml .github/workflows/publish.yml to:
update CHANGELOG.md
<commit entries> to <CHANGELOG.md entries> ordered by impact# re-run until version propagates
npm run test2
# re-run until version propagates
sh jslint_ci.sh shGithubPrCreate alpha beta # v20yy.mm.dd __pr_beta_pre
git push upstream alpha -f
goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-p20yy.mm.dd
Create pull requestAdd a title * with: <CHANGELOG.md entry #1>Add a description with:
Fixes #xxx.
This PR will:
<CHANGELOG.md entry #1>
This PR will additionally:
<CHANGELOG.md entry extra>
<screenshot>
Preview and reviewjslint-org/jslintbetaCreate pull request
wait awhile before continuing ...
Squash and merge
sh jslint_ci.sh shGithubPrCleanup
git push upstream alpha -f
Delete branchupdate .github/workflows/ci.yml .github/workflows/publish.yml to:
update CHANGELOG.md
<CHANGELOG.md entries> ordered by impact# re-run until version propagates
npm run test2
# re-run until version propagates
sh jslint_ci.sh shGithubPrCreate alpha master # v20yy.mm.dd __pr_master_pre
git push upstream alpha -f
goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-v20yy.mm.dd
Create pull requestAdd a title * with: # v20yy.mm.ddAdd a description with:
<CHANGELOG.md entry #1>
<CHANGELOG.md entry extra>
Preview and reviewjslint-org/jslintbetaCreate pull request
wait awhile before continuing ...
Squash and merge
sh jslint_ci.sh shGithubPrCleanup
git push upstream alpha -f
Delete branchgit push origin beta:master
git push upstream beta:master
Github ActionsOrganization or user* with: jslint-orgRepository* with: jslintWorkflow filename* with: publish.ymlSet up connection or Update Package Settingsgit push upstream beta:master
Tag: Select tag with: v20yy.mm.dd
Create new tag and click Createv20yy.mm.ddTarget: masterRelease title with: v20yy.mm.dd - <CHANGELOG.md entry #1>
Previous tag: AutoGenerate release notesWrite with:
<CHANGELOG.md entry #1>
<CHANGELOG.md entry extra>
**Full Changelog**: ...
Preview and reviewLatestPublish release
Successfully published @jslint-org/jslint@20yy.mm.dd
# 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-20yy.mm.dd.vsixRaw to downloadUpdatevscode-jslint-20yy.mm.dd.vsix[Succeeded] Extension publish on Visual Studio Marketplace - vscode-jslint(top 24 of 27)
131 followers · starred Nov 2010
264 followers · starred Nov 2010
816 followers · starred Nov 2010
292 followers · starred Nov 2010
JSLint, The JavaScript Code Quality and Coverage Tool
See the codeDouglas Crockford douglas@crockford.com
| Branch | master (v2026.9.29) | beta (Web Demo) | alpha (Development) |
|---|---|---|---|
| CI | |||
| Coverage | |||
| Demo | |||
| Artifacts |
#!/bin/sh
curl -L https://www.jslint.com/jslint.mjs > jslint.mjs
jslint.mjs in shell:#!/bin/sh
printf "console.log('hello world');\n" > hello.js
node jslint.mjs hello.js
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);
});
'
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);
});
}());
'
#!/bin/sh
# JSLint directory '.'
node jslint.mjs .
#!/bin/sh
printf '
/*jslint devel*/
console.log(
"hello world");
' > hello_autofix.js
node jslint.mjs jslint_autofix=hello_autofix.js
cat hello_autofix.js
#!/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);
'
#!/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
#!/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");
}());
'
#!/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
#!/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"
]
});
}());
'
Download and save jslint.mjs, jslint_wrapper_codemirror.js to file.
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>
jslint.mjs, jslint_wrapper_vim.vim to directory ~/.vim/:source ~/.vim/jslint_wrapper_vim.vim to file ~/.vimrc
jslint.mjs, jslint_wrapper_vim.vim to directory ~/vimfiles/:source ~/vimfiles/jslint_wrapper_vim.vim:SaveAndJslint<Ctrl-S> <Ctrl-J>vscode-jslint[JSLint - Lint File][Ctrl + Shift + J], [L][Cmd + Shift + J], [L] for Mac[JSLint - Autofix Whitespace][Ctrl + Shift + J], [A][Cmd + Shift + J], [A] for Mac/*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
}
v8CoverageListMerge is derived from MIT Licensed v8-coverage.update .github/workflows/ci.yml .github/workflows/publish.yml to:
update CHANGELOG.md
<commit entries> to <CHANGELOG.md entries> ordered by impact# re-run until version propagates
npm run test2
# re-run until version propagates
sh jslint_ci.sh shGithubPrCreate alpha beta # v20yy.mm.dd __pr_beta_pre
git push upstream alpha -f
goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-p20yy.mm.dd
Create pull requestAdd a title * with: <CHANGELOG.md entry #1>Add a description with:
Fixes #xxx.
This PR will:
<CHANGELOG.md entry #1>
This PR will additionally:
<CHANGELOG.md entry extra>
<screenshot>
Preview and reviewjslint-org/jslintbetaCreate pull request
wait awhile before continuing ...
Squash and merge
sh jslint_ci.sh shGithubPrCleanup
git push upstream alpha -f
Delete branchupdate .github/workflows/ci.yml .github/workflows/publish.yml to:
update CHANGELOG.md
<CHANGELOG.md entries> ordered by impact# re-run until version propagates
npm run test2
# re-run until version propagates
sh jslint_ci.sh shGithubPrCreate alpha master # v20yy.mm.dd __pr_master_pre
git push upstream alpha -f
goto https://github.com/jslint-org/jslint/compare/beta...kaizhu256:jslint:branch-v20yy.mm.dd
Create pull requestAdd a title * with: # v20yy.mm.ddAdd a description with:
<CHANGELOG.md entry #1>
<CHANGELOG.md entry extra>
Preview and reviewjslint-org/jslintbetaCreate pull request
wait awhile before continuing ...
Squash and merge
sh jslint_ci.sh shGithubPrCleanup
git push upstream alpha -f
Delete branchgit push origin beta:master
git push upstream beta:master
Github ActionsOrganization or user* with: jslint-orgRepository* with: jslintWorkflow filename* with: publish.ymlSet up connection or Update Package Settingsgit push upstream beta:master
Tag: Select tag with: v20yy.mm.dd
Create new tag and click Createv20yy.mm.ddTarget: masterRelease title with: v20yy.mm.dd - <CHANGELOG.md entry #1>
Previous tag: AutoGenerate release notesWrite with:
<CHANGELOG.md entry #1>
<CHANGELOG.md entry extra>
**Full Changelog**: ...
Preview and reviewLatestPublish release
Successfully published @jslint-org/jslint@20yy.mm.dd
# 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-20yy.mm.dd.vsixRaw to downloadUpdatevscode-jslint-20yy.mm.dd.vsix[Succeeded] Extension publish on Visual Studio Marketplace - vscode-jslint(top 24 of 27)
131 followers · starred Nov 2010
264 followers · starred Nov 2010
816 followers · starred Nov 2010
292 followers · starred Nov 2010