lint: Remove old jslint linter.

Now that we're using eslint, jslint is no longer required.
This commit is contained in:
kevv87 2016-12-03 00:46:10 +00:00 committed by Tim Abbott
parent 2c940b93ab
commit 1fb9220354
10 changed files with 7 additions and 6656 deletions

View File

@ -1,4 +1,3 @@
static/js/bundle.js static/js/bundle.js
static/js/blueslip.js static/js/blueslip.js
puppet/zulip_ops/files/statsd/local.js puppet/zulip_ops/files/statsd/local.js
tools/jslint/check-all.js

View File

@ -218,10 +218,6 @@ Files: tools/inject-messages/othello
Copyright: Shakespeare Copyright: Shakespeare
License: public-domain License: public-domain
Files: tools/jslint/jslint.js
Copyright: 2002 Douglas Crockford
License: XXX-good-not-evil
Files: tools/review Files: tools/review
Copyright: 2010 Ksplice, Inc. Copyright: 2010 Ksplice, Inc.
License: Apache-2.0 License: Apache-2.0

View File

@ -23,12 +23,7 @@ The Vagrant setup process runs this for you.
`lint-all` runs many lint checks in parallel, including `lint-all` runs many lint checks in parallel, including
- JavaScript ([JSLint](http://www.jslint.com/)) - JavaScript ([ESLint](http://eslint.org/))
> `tools/jslint/check-all.js` contains a pretty fine-grained set of
> JSLint options, rule exceptions, and allowed global variables. If
> you add a new global, you'll need to add it to the list.
- Python ([Pyflakes](http://pypi.python.org/pypi/pyflakes)) - Python ([Pyflakes](http://pypi.python.org/pypi/pyflakes))
- templates - templates
- Puppet configuration - Puppet configuration

View File

@ -17,9 +17,10 @@ prevent common coding errors.
We borrow some open source tools for much of our linting, and the links We borrow some open source tools for much of our linting, and the links
below will direct you to the official documentation for these projects. below will direct you to the official documentation for these projects.
- [jslint](https://github.com/douglascrockford/JSLint) - [eslint](http://eslint.org)
- [mypy](http://mypy-lang.org/) - [mypy](http://mypy-lang.org/)
- [puppet](https://puppet.com/) (puppet provides its own mechanism for validating manifests) - [puppet](https://puppet.com/) (puppet provides its own mechanism for
validating manifests)
- [pyflakes](https://pypi.python.org/pypi/pyflakes) - [pyflakes](https://pypi.python.org/pypi/pyflakes)
Zulip also uses some home-grown code to perform tasks like validating Zulip also uses some home-grown code to perform tasks like validating
@ -81,7 +82,7 @@ Most of our lint checks get performed by `./tools/lint-all`. These include the
following checks: following checks:
- Check Python code with pyflakes. - Check Python code with pyflakes.
- Check JavaScript code with jslint. - Check JavaScript code with eslint.
- Check Python code for custom Zulip rules. - Check Python code for custom Zulip rules.
- Check non-Python code for custom Zulip rules. - Check non-Python code for custom Zulip rules.
- Check puppet manifests with the puppet validator. - Check puppet manifests with the puppet validator.
@ -102,7 +103,7 @@ The rest of this document pertains to the checks that occur in `./tools/lint-all
Zulip has a script called `lint-all` that lives in our "tools" directory. Zulip has a script called `lint-all` that lives in our "tools" directory.
It is the workhorse of our linting system, although in some cases it It is the workhorse of our linting system, although in some cases it
dispatches the heavy lifting to other components such as pyflakes, dispatches the heavy lifting to other components such as pyflakes,
jslint, and other home grown tools. eslint, and other home grown tools.
You can find the source code [here](https://github.com/zulip/zulip/blob/master/tools/lint-all). You can find the source code [here](https://github.com/zulip/zulip/blob/master/tools/lint-all).
@ -161,7 +162,7 @@ that we exempt may be deemed not worthwhile to fix.
#### JavaScript code #### JavaScript code
We check our JavaScript code in a few different ways: We check our JavaScript code in a few different ways:
- We run jslint. - We run eslint.
- We perform custom Zulip regex checks on the code. - We perform custom Zulip regex checks on the code.
- We verify that all addClass calls, with a few exceptions, explicitly - We verify that all addClass calls, with a few exceptions, explicitly
contain a CSS class. contain a CSS class.

View File

@ -9,9 +9,6 @@
The file may still be accessible under other circumstances, so do The file may still be accessible under other circumstances, so do
not put sensitive information here. */ not put sensitive information here. */
// It's fine to use console.log etc. in this file.
/*jslint devel: true */
/* /*
print_elapsed_time("foo", foo) print_elapsed_time("foo", foo)

View File

@ -1,4 +1,3 @@
/*jslint nomen: true */
var message_list = (function () { var message_list = (function () {
var exports = {}; var exports = {};
@ -642,7 +641,6 @@ $(document).on('message_selected.zulip zuliphashchange.zulip mousewheel', functi
return exports; return exports;
}()); }());
/*jslint nomen: false */
if (typeof module !== 'undefined') { if (typeof module !== 'undefined') {
module.exports = message_list; module.exports = message_list;
} }

View File

@ -1,166 +0,0 @@
"use strict";
// Global variables, categorized by place of definition.
var globals =
// Third-party libraries
' $ _ jQuery Spinner Handlebars XDate zxcvbn Intl Notification'
+ ' LazyLoad Dropbox SockJS marked i18n'
// Node-based unit tests
+ ' module require'
// Cocoa<-> Javascript bridge
+ ' bridge'
// index.html
+ ' page_params'
// common.js
+ ' status_classes password_quality'
// setup.js
+ ' csrf_token'
// Modules, defined in their respective files.
+ ' compose compose_fade rows hotkeys narrow reload search subs pointer'
+ ' composebox_typeahead server_events typeahead_helper notifications hashchange'
+ ' invite ui viewport util activity timerender message_list MessageListView blueslip unread stream_list'
+ ' message_edit tab_bar emoji popovers navigate people settings alert_words_ui message_store'
+ ' avatar feature_flags search_suggestion referral stream_color Dict'
+ ' Filter summary admin stream_data muting WinChan muting_ui Socket channel gear_menu'
+ ' message_flags bot_data loading favicon resize scroll_bar condense floating_recipient_bar'
+ ' copy_and_paste click_handlers topic_list pm_list unread_ui components'
// colorspace.js
+ ' colorspace'
// tutorial.js
+ ' tutorial'
// templates.js
+ ' templates'
// alert_words.js
+ ' alert_words'
// fenced_code.js
+ ' fenced_code'
// echo.js
+ ' echo'
// localstorage.js
+ ' localstorage'
// zulip.js
+ ' home_msg_list current_msg_list'
;
var options = {
vars: true, // Allow multiple 'var' per function
sloppy: true, // Don't require "use strict"
white: true, // Lenient whitespace rules
plusplus: true, // Allow increment/decrement operators
regexp: true, // Allow . and [^...] in regular expressions
todo: true, // Allow "TODO" comments.
newcap: true, // Don't assume that capitalized functions are
// constructors (and the converse)
nomen: true, // Tolerate underscore at the beginning of a name
stupid: true // Allow synchronous methods
};
// For each error.raw message, we can return 'true' to ignore
// the error.
var exceptions = {
"Unexpected 'else' after 'return'." : function () {
return true;
},
"Don't make functions within a loop." : function () {
return true;
},
// We use typeof to test if a variable exists at all.
"Unexpected 'typeof'. Use '===' to compare directly with {a}.": function (error) {
return error.a === 'undefined';
}
};
var fs = require('fs');
var path = require('path');
var JSLINT = require(path.join(__dirname, 'jslint')).JSLINT;
var cwd = process.cwd();
var exit_code = 0;
var i;
// Drop 'node' and the script name from args.
for (i=0; i<2; i++) {
process.argv.shift();
}
process.argv.forEach(function (filepath) {
var contents = fs.readFileSync(filepath, 'utf8');
var messages = [];
// We mutate 'options' so be sure to clear everything.
if (filepath.indexOf('static/js/') !== -1) {
// Frontend browser code
options.browser = true;
options.node = false;
options.predef = globals.split(/\s+/);
} else {
// Backend code for Node.js
options.browser = false;
options.node = true;
if (filepath.indexOf('frontend_tests/') !== -1) {
// Include '$' and browser globals because we use them inside
// casper.evaluate
options.predef = ['casper', '$', 'document', 'window', 'set_global', 'add_dependencies', 'patch_builtin', 'assert', 'current_msg_list'];
} else {
options.predef = [];
}
}
if (!JSLINT(contents, options)) {
JSLINT.errors.forEach(function (error) {
if (error === null) {
// JSLint stopping error
messages.push(' (JSLint giving up)');
return;
}
var exn = exceptions[error.raw];
if (exn && exn(error)) {
// Ignore this error.
return;
}
// NB: this will break on a 10,000 line file
var line = (' ' + error.line).slice(-4);
messages.push(' ' + line + ' ' + error.reason);
});
if (messages.length > 0) {
exit_code = 1;
console.log(path.relative(cwd, filepath));
// Something very wacky happens if we do
// .forEach(console.log) directly.
messages.forEach(function (msg) {
console.log(msg);
});
console.log('');
}
}
});
process.exit(exit_code);

File diff suppressed because it is too large Load Diff

View File

@ -30,7 +30,6 @@ puppet/apt/.forge-release
puppet/apt/README.md puppet/apt/README.md
static/locale static/locale
static/third static/third
tools/jslint/jslint.js
zerver/migrations zerver/migrations
zproject/dev_settings.py zproject/dev_settings.py
zproject/settings.py zproject/settings.py
@ -502,13 +501,6 @@ def run():
result = subprocess.call(['tools/check-css']) result = subprocess.call(['tools/check-css'])
return result return result
@lint
def jslint():
# type: () -> int
result = subprocess.call(['node', 'tools/jslint/check-all.js']
+ by_lang['js'])
return result
@lint @lint
def eslint(): def eslint():
# type: () -> int # type: () -> int

View File

@ -35,7 +35,6 @@ certs
exclude_files = """ exclude_files = """
zilencer/management/commands/test_messages.txt zilencer/management/commands/test_messages.txt
tools/usability_testing/humbug_usability_test_data tools/usability_testing/humbug_usability_test_data
tools/jslint/jslint.js
""".split() """.split()
extensions = dict( extensions = dict(