From 497c7702cc381da719dc59d618640d1db17ff1bc Mon Sep 17 00:00:00 2001 From: Arpith Siromoney Date: Fri, 4 Nov 2016 18:15:18 -0400 Subject: [PATCH] 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. --- .eslintignore | 4 + .eslintrc | 177 +++++++++++++++++++++++++++++++++++++++ frontend_tests/.eslintrc | 16 ++++ package.json | 16 ++-- static/js/.eslintrc | 5 ++ tools/lint-all | 7 ++ 6 files changed, 219 insertions(+), 6 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 frontend_tests/.eslintrc create mode 100644 static/js/.eslintrc diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..c08ca08a05 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +static/js/bundle.js +static/js/blueslip.js +puppet/zulip_ops/files/statsd/local.js +tools/jslint/check-all.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000000..ef6aaa8529 --- /dev/null +++ b/.eslintrc @@ -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 + } +} diff --git a/frontend_tests/.eslintrc b/frontend_tests/.eslintrc new file mode 100644 index 0000000000..b84b246fac --- /dev/null +++ b/frontend_tests/.eslintrc @@ -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 + } +} diff --git a/package.json b/package.json index dd38a91fd1..36f4c947a4 100644 --- a/package.json +++ b/package.json @@ -16,17 +16,21 @@ "webpack": "1.12.2" }, "devDependencies": { + "casperjs": "1.1.3", + "cssstyle": "0.2.29", + "eslint": "^3.9.1", + "htmlparser2": "3.8.3", "istanbul": "0.4.0", "jsdom": "9.4.1", - "xmlhttprequest": "1.5.0", "nwmatcher": "1.3.6", - "htmlparser2": "3.8.3", - "cssstyle": "0.2.29", - "webpack-dev-server": "1.12.1", "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": { "type": "git", "url": "https://github.com/zulip/zulip.git" diff --git a/static/js/.eslintrc b/static/js/.eslintrc new file mode 100644 index 0000000000..b99c1118dd --- /dev/null +++ b/static/js/.eslintrc @@ -0,0 +1,5 @@ +{ + "env": { + "browser": true + } +} diff --git a/tools/lint-all b/tools/lint-all index 39d9d0f12f..c666abb305 100755 --- a/tools/lint-all +++ b/tools/lint-all @@ -492,6 +492,13 @@ def run(): + by_lang['js']) return result + @lint + def eslint(): + # type: () -> int + result = subprocess.call(['npm', 'run', '--silent', 'lint'] + + by_lang['js']) + return result + @lint def puppet(): # type: () -> int