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