Run eslint in tools/lint-all with npm run --silent lint

This commit adds a basic eslintrc that emulates jslint defaults.
Rules that conflict with our existing code have been switched to
warnings instead of errors. Globals have been added to the eslintrc. The
bundled js file (generated by webpack) and blueslip.js are ignored with
.eslintignore.

To display warnings, run npm run lint-loud. This runs eslint without the
--quiet option on static/js and frontend_tests.

npm run --silent lint is run by tools/lint-all (in addition to jslint).
The --silent option is used to suppress the default output from npm run.

Fixes #535.
This commit is contained in:
Arpith Siromoney 2016-11-04 18:15:18 -04:00 committed by Tim Abbott
parent 2d81813145
commit 497c7702cc
6 changed files with 219 additions and 6 deletions

4
.eslintignore Normal file
View File

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

177
.eslintrc Normal file
View File

@ -0,0 +1,177 @@
{
"env": {
"node": true
},
"globals": {
"$": false,
"_": false,
"jQuery": false,
"Spinner": false,
"Handlebars": false,
"XDate": false,
"zxcvbn": false,
"LazyLoad": false,
"Dropbox": false,
"SockJS": false,
"marked": false,
"i18n": false,
"bridge": false,
"page_params": false,
"status_classes": false,
"password_quality": false,
"csrf_token": false,
"typeahead_helper": false,
"popovers": false,
"server_events": false,
"ui": false,
"stream_color": false,
"people": false,
"navigate": false,
"settings": false,
"resize": false,
"loading": false,
"compose": false,
"compose_fade": false,
"subs": false,
"timerender": false,
"message_edit": false,
"reload": false,
"composebox_typeahead": false,
"search": false,
"topic_list": false,
"gear_menu": false,
"hashchange": false,
"message_list": false,
"Filter": false,
"pointer": false,
"util": false,
"MessageListView": false,
"blueslip": false,
"rows": false,
"WinChan": false,
"muting_ui": false,
"Socket": false,
"channel": false,
"viewport": false,
"avatar": false,
"feature_flags": false,
"search_suggestion": false,
"referral": false,
"notifications": false,
"message_flags": false,
"bot_data": false,
"stream_list": false,
"narrow": false,
"admin": false,
"stream_data": false,
"muting": false,
"Dict": false,
"unread": false,
"alert_words_ui": false,
"message_store": false,
"favicon": false,
"condense": false,
"floating_recipient_bar": false,
"tab_bar": false,
"emoji": false,
"activity": false,
"invite": false,
"colorspace": false,
"tutorial": false,
"templates": false,
"alert_words": false,
"fenced_code": false,
"echo": false,
"localstorage": false,
"current_msg_list": true,
"home_msg_list": false,
"pm_list": false,
"unread_ui": false
},
"rules": {
"no-alert": 2,
"no-array-constructor": 2,
"no-caller": 2,
"no-bitwise": 2,
"no-catch-shadow": 2,
"comma-dangle": 0,
"no-console": 1,
"no-control-regex": 2,
"no-debugger": 2,
"no-div-regex": 2,
"no-dupe-keys": 2,
"no-else-return": 1,
"no-empty": 1,
"no-empty-character-class": 2,
"no-eq-null": 2,
"no-eval": 2,
"no-ex-assign": 2,
"no-extra-semi": 2,
"no-func-assign": 2,
"no-floating-decimal": 2,
"no-implied-eval": 2,
"no-with": 2,
"no-fallthrough": 2,
"no-unreachable": 2,
"no-undef": 2,
"no-undef-init": 2,
"no-unused-expressions": 2,
"no-octal": 2,
"no-octal-escape": 2,
"no-obj-calls": 2,
"no-multi-str": 2,
"no-new-wrappers": 2,
"no-new": 2,
"no-new-func": 2,
"no-native-reassign": 2,
"no-plusplus": 1,
"no-delete-var": 2,
"no-return-assign": 2,
"no-new-object": 2,
"no-label-var": 2,
"no-ternary": 0,
"no-self-compare": 2,
"no-sync": 2,
"no-underscore-dangle": 1,
"no-loop-func": 1,
"no-labels": 2,
"no-unused-vars": 1,
"no-script-url": 2,
"no-proto": 2,
"no-iterator": 2,
"no-mixed-requires": [0, false],
"no-extra-parens": ["error", "functions"],
"no-shadow": 1,
"no-use-before-define": 2,
"no-redeclare": 2,
"no-regex-spaces": 2,
"brace-style": [1, "1tbs"],
"block-scoped-var": 0,
"camelcase": 1,
"complexity": [0, 4],
"curly": 2,
"dot-notation": 2,
"eqeqeq": 2,
"guard-for-in": 0,
"max-depth": [0, 4],
"max-len": [0, 80, 4],
"max-params": [0, 3],
"max-statements": [0, 10],
"new-cap": 1,
"new-parens": 2,
"one-var": 1,
"quotes": [1, "single"],
"quote-props": 0,
"radix": 0,
"semi": 2,
"keyword-spacing": 1,
"space-before-blocks": 1,
"strict": 1,
"unnecessary-strict": 0,
"use-isnan": 2,
"valid-typeof": 0,
"wrap-iife": 2,
"wrap-regex": 0,
"yoda": 1
}
}

16
frontend_tests/.eslintrc Normal file
View File

@ -0,0 +1,16 @@
{
"env": {
"shared-node-browser": true
},
"globals": {
"assert": false,
"add_dependencies": false,
"casper": false,
"document": false,
"set_global": false,
"window": false
},
"rules": {
"no-sync": 1
}
}

View File

@ -16,17 +16,21 @@
"webpack": "1.12.2" "webpack": "1.12.2"
}, },
"devDependencies": { "devDependencies": {
"casperjs": "1.1.3",
"cssstyle": "0.2.29",
"eslint": "^3.9.1",
"htmlparser2": "3.8.3",
"istanbul": "0.4.0", "istanbul": "0.4.0",
"jsdom": "9.4.1", "jsdom": "9.4.1",
"xmlhttprequest": "1.5.0",
"nwmatcher": "1.3.6", "nwmatcher": "1.3.6",
"htmlparser2": "3.8.3",
"cssstyle": "0.2.29",
"webpack-dev-server": "1.12.1",
"phantomjs-prebuilt": "2.1.7", "phantomjs-prebuilt": "2.1.7",
"casperjs": "1.1.3" "webpack-dev-server": "1.12.1",
"xmlhttprequest": "1.5.0"
},
"scripts": {
"lint": "eslint --quiet",
"lint-loud": "eslint static/js frontend_tests"
}, },
"scripts": {},
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/zulip/zulip.git" "url": "https://github.com/zulip/zulip.git"

5
static/js/.eslintrc Normal file
View File

@ -0,0 +1,5 @@
{
"env": {
"browser": true
}
}

View File

@ -492,6 +492,13 @@ def run():
+ by_lang['js']) + by_lang['js'])
return result return result
@lint
def eslint():
# type: () -> int
result = subprocess.call(['npm', 'run', '--silent', 'lint']
+ by_lang['js'])
return result
@lint @lint
def puppet(): def puppet():
# type: () -> int # type: () -> int