From cbc8638c38bccd4ac7b787ac4d79de4bf2b6a0a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski?= Date: Thu, 3 Nov 2016 00:51:34 +0100 Subject: [PATCH] Build: ESLint setup improvements 1. Use the short name of the preset in the config. 2. Run ESLint first on non-minified files. 3. Explicitly specify environments in every config file (those settings cascade which means we've been assuming a Node.js environment where we shouldn't have). --- .eslintrc-browser.json | 31 +++++++++++++++++++++ .eslintrc-node.json | 13 +++++++++ .eslintrc.json | 6 ++-- Gruntfile.js | 13 +++++++-- dist/.eslintrc.json | 5 +++- src/.eslintrc.json | 19 ++----------- test/.eslintrc.json | 20 +++++++------ test/node_smoke_tests/.eslintrc.json | 12 ++++++-- test/promises_aplus_adapters/.eslintrc.json | 5 ++-- 9 files changed, 88 insertions(+), 36 deletions(-) create mode 100644 .eslintrc-browser.json create mode 100644 .eslintrc-node.json diff --git a/.eslintrc-browser.json b/.eslintrc-browser.json new file mode 100644 index 000000000..c704209ab --- /dev/null +++ b/.eslintrc-browser.json @@ -0,0 +1,31 @@ +{ + "root": true, + + "extends": "jquery", + + // Support: IE <=9 only, Android <=4.0 only + // The above browsers are failing a lot of tests in the ES5 + // test suite at http://test262.ecmascript.org. + "parserOptions": { + "ecmaVersion": 3 + }, + + // The browser env is not enabled on purpose so that code takes + // all browser-only globals from window instead of assuming + // they're available as globals. This makes it possible to use + // jQuery with tools like jsdom which provide a custom window + // implementation. + "env": {}, + + "globals": { + "window": true, + "jQuery": true, + "define": true, + "module": true, + "noGlobal": true + }, + + "rules": { + "strict": ["error", "function"] + } +} diff --git a/.eslintrc-node.json b/.eslintrc-node.json new file mode 100644 index 000000000..904e7ba94 --- /dev/null +++ b/.eslintrc-node.json @@ -0,0 +1,13 @@ +{ + "root": true, + + "extends": "jquery", + + "parserOptions": { + "ecmaVersion": 5 + }, + + "env": { + "node": true + } +} diff --git a/.eslintrc.json b/.eslintrc.json index 6dcb6353a..d2c977ca8 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,7 +1,5 @@ { - "extends": "eslint-config-jquery", "root": true, - "env": { - "node": true - } + + "extends": "./.eslintrc-node.json" } diff --git a/Gruntfile.js b/Gruntfile.js index 200424d35..fbb271630 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -203,12 +203,21 @@ module.exports = function( grunt ) { grunt.registerTask( "lint", [ "jsonlint", - runIfNewNode( "eslint" ) + + // Running the full eslint task without breaking it down to targets + // would run the dist target first which would point to errors in the built + // file, making it harder to fix them. We want to check the built file only + // if we already know the source files pass the linter. + runIfNewNode( "eslint:dev" ), + runIfNewNode( "eslint:dist" ) ] ); grunt.registerTask( "lint:newer", [ "newer:jsonlint", - runIfNewNode( "newer:eslint" ) + + // Don't replace it with just the task; see the above comment. + runIfNewNode( "newer:eslint:dev" ), + runIfNewNode( "newer:eslint:dist" ) ] ); grunt.registerTask( "test:fast", runIfNewNode( "node_smoke_tests" ) ); diff --git a/dist/.eslintrc.json b/dist/.eslintrc.json index b99e682f4..a15539adb 100644 --- a/dist/.eslintrc.json +++ b/dist/.eslintrc.json @@ -1,5 +1,8 @@ { - "extends": "../src/.eslintrc.json", + "root": true, + + "extends": "../.eslintrc-browser.json", + "rules": { // That is okay for the built version "no-multiple-empty-lines": "off", diff --git a/src/.eslintrc.json b/src/.eslintrc.json index dbf16c584..3a4a3d257 100644 --- a/src/.eslintrc.json +++ b/src/.eslintrc.json @@ -1,18 +1,5 @@ { - // Support: IE <=9 only, Android <=4.0 only - // The above browsers are failing a lot of tests in the ES5 - // test suite at http://test262.ecmascript.org. - "parserOptions": { - "ecmaVersion": 3 - }, - "globals": { - "window": true, - "jQuery": true, - "define": true, - "module": true, - "noGlobal": true - }, - "rules": { - "strict": ["error", "function"] - } + "root": true, + + "extends": "../.eslintrc-browser.json" } diff --git a/test/.eslintrc.json b/test/.eslintrc.json index 744de89ec..8cc2adc96 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -1,13 +1,15 @@ { + "root": true, + + "extends": "../.eslintrc-browser.json", + "env": { + + // In source the browser env is not enabled but unit tests rely on them + // too much and we don't run them in non-browser environments anyway. "browser": true }, - // Support: IE <=9 only, Android <=4.0 only - // The above browsers are failing a lot of tests in the ES5 - // test suite at http://test262.ecmascript.org. - "parserOptions": { - "ecmaVersion": 3 - }, + "globals": { "require": false, "define": false, @@ -41,17 +43,19 @@ "baseURL": true, "externalHost": true }, + "rules": { // See https://github.com/eslint/eslint/issues/2342 "no-unused-vars": "off", - // Too much errors + // Too many errors "max-len": "off", "brace-style": "off", "key-spacing": "off", "camelcase": "off", + "strict": "off", - // Not really too much - waiting autofix features for these rules + // Not really too many - waiting for autofix features for these rules "lines-around-comment": "off", "dot-notation": "off" } diff --git a/test/node_smoke_tests/.eslintrc.json b/test/node_smoke_tests/.eslintrc.json index 0877d24af..91ec5ba4e 100644 --- a/test/node_smoke_tests/.eslintrc.json +++ b/test/node_smoke_tests/.eslintrc.json @@ -1,7 +1,13 @@ { + "root": true, + + "extends": "../../.eslintrc-node.json", + + "parserOptions": { + "ecmaVersion": 2015 + }, + "env": { "es6": true - }, - "extends" : "../../.eslintrc.json", - "root": true + } } diff --git a/test/promises_aplus_adapters/.eslintrc.json b/test/promises_aplus_adapters/.eslintrc.json index d11775710..f961645e5 100644 --- a/test/promises_aplus_adapters/.eslintrc.json +++ b/test/promises_aplus_adapters/.eslintrc.json @@ -1,4 +1,5 @@ { - "extends": "../../.eslintrc.json", - "root": true + "root": true, + + "extends": "../../.eslintrc-node.json" }