From 5ee595807d93c20b34b4ac21def1c05b74809747 Mon Sep 17 00:00:00 2001 From: Jake Jarvis Date: Sat, 18 Dec 2021 20:08:07 -0500 Subject: [PATCH] manually cherry-pick (most of) the rules/settings from eslint-config-preact --- .eslintrc.cjs | 59 ++++++++++++- assets/js/restore-theme.js | 2 +- assets/js/src/components/ThemeToggle.js | 2 +- package.json | 4 +- yarn.lock | 109 +++++------------------- 5 files changed, 82 insertions(+), 94 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 3bcfcf99..b36ea101 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,10 +1,67 @@ module.exports = { root: true, - extends: ["@jakejarvis/eslint-config", "preact", "plugin:jsx-a11y/recommended", "plugin:prettier/recommended"], + extends: [ + "@jakejarvis/eslint-config", + "plugin:compat/recommended", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "plugin:jsx-a11y/recommended", + "plugin:prettier/recommended", + ], plugins: ["jsx-a11y", "prettier"], parser: "@babel/eslint-parser", parserOptions: { ecmaVersion: 2020, + ecmaFeatures: { + modules: true, + impliedStrict: true, + jsx: true, + }, + jsxPragma: null, + }, + env: { + browser: true, + es6: true, + node: true, + }, + settings: { + polyfills: ["fetch", "Promise"], + react: { + pragma: "h", + version: "17.0", + }, + }, + rules: { + // Mostly cherry-picked from eslint-config-preact: + // https://github.com/preactjs/eslint-config-preact/blob/v1.3.0/index.js + "react/display-name": ["warn", { ignoreTranspilerName: false }], + "react/jsx-key": ["error", { checkFragmentShorthand: true }], + "react/jsx-no-bind": [ + "warn", + { + ignoreRefs: true, + allowFunctions: true, + allowArrowFunctions: true, + }, + ], + "react/jsx-no-comment-textnodes": "error", + "react/jsx-no-duplicate-props": "error", + "react/jsx-no-target-blank": "error", + "react/jsx-no-undef": "error", + "react/jsx-tag-spacing": ["error", { beforeSelfClosing: "always" }], + "react/jsx-uses-react": "error", + "react/jsx-uses-vars": "error", + "react/no-danger": "warn", + "react/no-deprecated": "error", + "react/no-unknown-property": ["error", { ignore: ["class"] }], // className in react == class in preact + "react/prefer-es6-class": "error", + "react/prefer-stateless-function": "warn", + "react/prop-types": "off", + "react/react-in-jsx-scope": "off", + "react/require-render-return": "error", + "react/self-closing-comp": "error", + "react-hooks/exhaustive-deps": "warn", + "react-hooks/rules-of-hooks": "error", }, ignorePatterns: ["public/**", "static/assets/**"], }; diff --git a/assets/js/restore-theme.js b/assets/js/restore-theme.js index 57903007..d33a54fd 100644 --- a/assets/js/restore-theme.js +++ b/assets/js/restore-theme.js @@ -10,4 +10,4 @@ try { // - the user's OS is in dark mode. const pref = getDarkPref(); updateDOM(pref === "true" || (!pref && window.matchMedia("(prefers-color-scheme: dark)").matches)); -} catch (e) {} +} catch (e) {} // eslint-disable-line no-empty diff --git a/assets/js/src/components/ThemeToggle.js b/assets/js/src/components/ThemeToggle.js index 24b60adb..d357a9b6 100644 --- a/assets/js/src/components/ThemeToggle.js +++ b/assets/js/src/components/ThemeToggle.js @@ -25,7 +25,7 @@ const ThemeToggle = () => { // cleanup and stop listening if/when preference is explicitly set return () => matcher.removeEventListener("change", matchCallback, true); - } catch (e) {} + } catch (e) {} // eslint-disable-line no-empty }, [saved, matchCallback]); // sets appropriate `` and `color-scheme` CSS property when mode changes diff --git a/package.json b/package.json index 664d761d..1342c0e6 100644 --- a/package.json +++ b/package.json @@ -68,10 +68,12 @@ "del": "^6.0.0", "dotenv": "^10.0.0", "eslint": "~8.5.0", - "eslint-config-preact": "~1.2.0", "eslint-config-prettier": "~8.3.0", + "eslint-plugin-compat": "~4.0.0", "eslint-plugin-jsx-a11y": "~6.5.1", "eslint-plugin-prettier": "~4.0.0", + "eslint-plugin-react": "~7.27.1", + "eslint-plugin-react-hooks": "~4.3.0", "gulp": "^4.0.2", "gulp-cache": "^1.1.3", "gulp-cli": "^2.3.0", diff --git a/yarn.lock b/yarn.lock index 836ae84c..c73de831 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,7 +14,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== -"@babel/core@^7.13.16", "@babel/core@^7.15.5", "@babel/core@^7.16.5": +"@babel/core@^7.15.5", "@babel/core@^7.16.5": version "7.16.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.5.tgz#924aa9e1ae56e1e55f7184c8bf073a50d8677f5c" integrity sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ== @@ -35,7 +35,7 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/eslint-parser@^7.13.14", "@babel/eslint-parser@^7.16.5": +"@babel/eslint-parser@^7.16.5": version "7.16.5" resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz#48d3485091d6e36915358e4c0d0b2ebe6da90462" integrity sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA== @@ -439,13 +439,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.12.13": - version "7.16.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.5.tgz#8d397dee482716a79f1a22314f0b4770a5b67427" - integrity sha512-3CbYTXfflvyy8O819uhZcZSMedZG4J8yS/NLTc/8T24M9ke1GssTGvg8VZu3Yn2LU5IyQSv1CmPq0a9JWHXJwg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.5" - "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -467,7 +460,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.16.5": +"@babel/plugin-syntax-jsx@^7.16.5": version "7.16.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.5.tgz#bf255d252f78bc8b77a17cadc37d1aa5b8ed4394" integrity sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q== @@ -1419,7 +1412,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== @@ -1480,29 +1473,6 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/experimental-utils@^2.5.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -2537,10 +2507,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001179, caniuse-lite@^1.0.30001251, caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001286: - version "1.0.30001289" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001289.tgz#d62a20175c4d9e740feda12a78b7c8df7866329e" - integrity sha512-hV6x4IfrYViN8cJbGFVbjD7KCrhS/O7wfDgvevYRanJ/IN+hhxpTcXXqaxy3CzPNFe5rlqdimdEB/k7H0YzxHg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001179, caniuse-lite@^1.0.30001267, caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001286: + version "1.0.30001291" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001291.tgz#08a8d2cfea0b2cf2e1d94dd795942d0daef6108c" + integrity sha512-roMV5V0HNGgJ88s42eE70sstqGW/gwFndosYrikHthw98N5tLnOTxFqMLQjZVRxTWFlJ4rn+MsgXrR7MDPY4jA== careful-downloader@^2.0.1: version "2.0.1" @@ -3815,47 +3785,25 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-preact@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-preact/-/eslint-config-preact-1.2.0.tgz#5e934607491bfed3d7def28a4834b18ee71d3e27" - integrity sha512-1jAeR9qi0yotuuki6ROzvi2xacFWGUSFZqWZnqpRDtKS+yIK0gaeTwyQpCb7k5Z3KULBxgN0tdytXaH5e7JBow== - dependencies: - "@babel/core" "^7.13.16" - "@babel/eslint-parser" "^7.13.14" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-decorators" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - eslint-plugin-compat "^3.5.1" - eslint-plugin-jest "^23.7.0" - eslint-plugin-react "^7.0.0" - eslint-plugin-react-hooks "^4.2.0" - eslint-config-prettier@~8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== -eslint-plugin-compat@^3.5.1: - version "3.13.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-3.13.0.tgz#fade6f2ad25263cf93f8d23c988533551ced8663" - integrity sha512-cv8IYMuTXm7PIjMVDN2y4k/KVnKZmoNGHNq27/9dLstOLydKblieIv+oe2BN2WthuXnFNhaNvv3N1Bvl4dbIGA== +eslint-plugin-compat@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-4.0.0.tgz#4ecfb8b6b04ad24439cae3b5937ae9eda0826c47" + integrity sha512-lg9CPq0bsGxNXcLZgxqVAYsUUELIKZPRiwnJJQOHH910zCHEiscO00Sp+w9wflKEa/OtVaYfNhI2jOViRPZtjw== dependencies: "@mdn/browser-compat-data" "^3.3.14" ast-metadata-inferer "^0.7.0" browserslist "^4.16.8" - caniuse-lite "^1.0.30001251" + caniuse-lite "^1.0.30001267" core-js "^3.16.2" find-up "^5.0.0" lodash.memoize "4.1.2" semver "7.3.5" -eslint-plugin-jest@^23.7.0: - version "23.20.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.20.0.tgz#e1d69c75f639e99d836642453c4e75ed22da4099" - integrity sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw== - dependencies: - "@typescript-eslint/experimental-utils" "^2.5.0" - eslint-plugin-jsx-a11y@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" @@ -3881,12 +3829,12 @@ eslint-plugin-prettier@~4.0.0: dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-react-hooks@^4.2.0: +eslint-plugin-react-hooks@~4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== -eslint-plugin-react@^7.0.0: +eslint-plugin-react@~7.27.1: version "7.27.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz#469202442506616f77a854d91babaae1ec174b45" integrity sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA== @@ -3906,7 +3854,7 @@ eslint-plugin-react@^7.0.0: semver "^6.3.0" string.prototype.matchall "^4.0.6" -eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3922,13 +3870,6 @@ eslint-scope@^7.1.0: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" @@ -3936,11 +3877,6 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" @@ -4859,7 +4795,7 @@ glob-watcher@^5.0.3: normalize-path "^3.0.0" object.defaults "^1.1.0" -glob@^7.1.1, glob@^7.1.3, glob@^7.1.6, glob@~7.2.0: +glob@^7.1.1, glob@^7.1.3, glob@~7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -8855,7 +8791,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.5, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@7.3.5, semver@^7.2.1, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -9934,7 +9870,7 @@ trim-repeated@^1.0.0: dependencies: escape-string-regexp "^1.0.2" -tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -9949,13 +9885,6 @@ tslib@~2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== -tsutils@^3.17.1: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"