diff --git a/.eslintrc-base.json b/.eslintrc-base.json deleted file mode 100644 index 14a1831841..0000000000 --- a/.eslintrc-base.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "rules": { - "max-len": [ - "error", - { "code": 80, "ignoreUrls": true, "ignoreTemplateLiterals": true } - ], - "block-scoped-var": 0, - "brace-style": [2, "1tbs", { "allowSingleLine": true }], - "camelcase": 2, - "comma-dangle": 2, - "comma-spacing": [2, { "before": false, "after": true }], - "comma-style": [2, "last"], - "complexity": 0, - "consistent-return": 2, - "consistent-this": 0, - "curly": 2, - "default-case": 2, - "dot-notation": 0, - "eol-last": 2, - "eqeqeq": 2, - "func-call-spacing": 2, - "func-names": 0, - "func-style": 0, - "guard-for-in": 2, - "handle-callback-err": 2, - "import/default": 2, - "import/export": 2, - "import/extensions": [0, "always"], - "import/first": 2, - "import/named": 2, - "import/namespace": 2, - "import/newline-after-import": 2, - "import/no-duplicates": 2, - "import/no-unresolved": [2, { "commonjs": true }], - "import/order": [2, { "alphabetize": { "order": "asc" } }], - "import/unambiguous": 2, - "import/no-anonymous-default-export": 2, - "jsx-quotes": [2, "prefer-single"], - "key-spacing": [2, { "beforeColon": false, "afterColon": true }], - "keyword-spacing": [2], - "max-depth": 0, - "max-nested-callbacks": 0, - "max-params": 0, - "max-statements": 0, - "new-cap": 0, - "new-parens": 2, - "no-alert": 2, - "no-array-constructor": 2, - "no-bitwise": 2, - "no-caller": 2, - "no-cond-assign": 2, - "no-console": 0, - "no-constant-condition": 2, - "no-control-regex": 2, - "no-debugger": 2, - "no-delete-var": 2, - "no-div-regex": 2, - "no-dupe-keys": 2, - "no-else-return": 0, - "no-empty": 2, - "no-empty-character-class": 2, - "no-eq-null": 2, - "no-eval": 2, - "no-ex-assign": 2, - "no-extend-native": 2, - "no-extra-bind": 2, - "no-extra-boolean-cast": 2, - "no-extra-parens": 0, - "no-extra-semi": 2, - "no-fallthrough": 2, - "no-floating-decimal": 2, - "no-func-assign": 2, - "no-global-assign": 2, - "no-implied-eval": 2, - "no-inline-comments": 2, - "no-inner-declarations": 2, - "no-invalid-regexp": 2, - "no-irregular-whitespace": 2, - "no-iterator": 2, - "no-label-var": 2, - "no-labels": 2, - "no-lone-blocks": 2, - "no-lonely-if": 2, - "no-loop-func": 2, - "no-mixed-requires": 0, - "no-mixed-spaces-and-tabs": 2, - "no-multi-spaces": 2, - "no-multi-str": 2, - "no-multiple-empty-lines": [2, { "max": 2 }], - "no-nested-ternary": 2, - "no-new": 2, - "no-new-func": 2, - "no-new-object": 2, - "no-new-require": 2, - "no-new-wrappers": 2, - "no-obj-calls": 2, - "no-octal": 2, - "no-octal-escape": 2, - "no-path-concat": 2, - "no-plusplus": 0, - "no-process-env": 0, - "no-process-exit": 2, - "no-proto": 2, - "no-regex-spaces": 2, - "no-reserved-keys": 0, - "no-restricted-modules": 0, - "no-return-assign": 2, - "no-script-url": 2, - "no-self-compare": 2, - "no-sequences": 2, - "no-shadow": 0, - "no-shadow-restricted-names": 2, - "no-sparse-arrays": 2, - "no-sync": 0, - "no-ternary": 0, - "no-trailing-spaces": 2, - "no-undef": 2, - "no-undef-init": 2, - "no-undefined": 2, - "no-underscore-dangle": 0, - "no-unreachable": 2, - "no-unsafe-negation": 2, - "no-unused-expressions": 2, - "no-unused-vars": 2, - "no-use-before-define": 0, - "no-useless-rename": 2, - "no-void": 0, - "no-warning-comments": [2, { "terms": ["fixme"], "location": "start" }], - "no-with": 2, - "one-var": 0, - "operator-assignment": 0, - "padded-blocks": 0, - "prefer-object-spread/prefer-object-spread": 2, - "quote-props": [2, "as-needed"], - "quotes": [2, "single", "avoid-escape"], - "radix": 2, - "react/display-name": 2, - "react/jsx-boolean-value": [2, "always"], - "react/jsx-closing-bracket-location": [ - 2, - { "selfClosing": "line-aligned", "nonEmpty": "props-aligned" } - ], - "react/jsx-no-undef": 2, - "react/jsx-sort-props": [2, { "ignoreCase": true }], - "react/jsx-uses-react": 2, - "react/jsx-uses-vars": 2, - "react/jsx-wrap-multilines": 2, - "react/jsx-fragments": 2, - "react/no-did-mount-set-state": 2, - "react/no-did-update-set-state": 2, - "react/no-multi-comp": [2, { "ignoreStateless": true }], - "react/no-unescaped-entities": 0, - "react/no-unknown-property": 2, - "react/prop-types": 2, - "react/react-in-jsx-scope": 2, - "react/self-closing-comp": 2, - "react/sort-prop-types": 2, - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "error", - "semi": [2, "always"], - "semi-spacing": [2, { "before": false, "after": true }], - "sort-vars": 0, - "space-before-blocks": [2, "always"], - "space-before-function-paren": [2, "never"], - "space-in-brackets": 0, - "space-in-parens": 0, - "space-infix-ops": 2, - "space-unary-ops": [2, { "words": true, "nonwords": false }], - "spaced-comment": [2, "always", { "exceptions": ["-"] }], - "strict": 0, - "use-isnan": 2, - "valid-jsdoc": 0, - "valid-typeof": 2, - "vars-on-top": 0, - "wrap-iife": [2, "any"], - "wrap-regex": 2, - "yoda": 0 - } -} diff --git a/.eslintrc.json b/.eslintrc.json index 332c7d8ff5..cd77be785d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -9,20 +9,14 @@ "parser": "babel-eslint", "root": true, "extends": [ - "./.eslintrc-base.json", + "eslint:recommended", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "plugin:import/recommended", "plugin:import/typescript", "plugin:jsx-a11y/recommended", "prettier" ], - "plugins": [ - "react", - "import", - "prefer-object-spread", - "react-hooks", - "jsx-a11y", - "jest-dom", - "testing-library" - ], "globals": { "Promise": true, "window": true, @@ -33,11 +27,13 @@ }, "settings": { "react": { - "version": "16.4.2", - "import/ignore": ["\\.json$"], - "import/extensions": [".js", ".jsx", ".tsx", ".ts"] - }, - "import/ignore": ["node_modules"] + "version": "16.4.2" + } + }, + "rules": { + "import/named": 2, + "import/no-named-as-default": 0, + "import/no-named-as-default-member": 0 }, "overrides": [ { @@ -56,6 +52,7 @@ ], "plugins": ["@typescript-eslint"], "rules": { + "import/named": 0, "@typescript-eslint/naming-convention": [ "error", { @@ -104,7 +101,11 @@ "./tools/ui-components/**/*.test.[jt]s?(x)", "./client/**/*.test.[jt]s?(x)" ], - "extends": ["plugin:testing-library/react", "plugin:jest-dom/recommended"] + "extends": [ + "plugin:testing-library/react", + "plugin:jest-dom/recommended" + ], + "rules": { "import/named": 2 } }, { "files": ["cypress/**/*.js"], diff --git a/client/i18n/schema-validation.js b/client/i18n/schema-validation.js index d6efa04f84..187ed2ed18 100644 --- a/client/i18n/schema-validation.js +++ b/client/i18n/schema-validation.js @@ -202,7 +202,8 @@ const motivationSchemaValidation = languages => { if ( !fileJson.motivationalQuotes.every( object => - object.hasOwnProperty('quote') && object.hasOwnProperty('author') + Object.prototype.hasOwnProperty.call(object, 'quote') && + Object.prototype.hasOwnProperty.call(object, 'author') ) ) { console.warn(`${language}/motivation.json has malformed quote objects.`); diff --git a/client/plugins/fcc-source-challenges/create-challenge-nodes.js b/client/plugins/fcc-source-challenges/create-challenge-nodes.js index 984dc3bed6..394364f033 100644 --- a/client/plugins/fcc-source-challenges/create-challenge-nodes.js +++ b/client/plugins/fcc-source-challenges/create-challenge-nodes.js @@ -31,7 +31,6 @@ function createChallengeNode(challenge, reporter) { type: challenge.challengeType === 7 ? 'CertificateNode' : 'ChallengeNode' }; - /* eslint-disable prefer-object-spread/prefer-object-spread */ return JSON.parse( JSON.stringify( Object.assign( diff --git a/client/plugins/fcc-source-challenges/gatsby-node.js b/client/plugins/fcc-source-challenges/gatsby-node.js index fb305ba6ea..88c4a3c717 100644 --- a/client/plugins/fcc-source-challenges/gatsby-node.js +++ b/client/plugins/fcc-source-challenges/gatsby-node.js @@ -29,7 +29,7 @@ exports.sourceNodes = function sourceChallengesSourceNodes( } const { createNode } = actions; const watcher = chokidar.watch(curriculumPath, { - ignored: /(^|[\/\\])\../, + ignored: /(^|[/\\])\../, ignoreInitial: true, persistent: true, usePolling: true, diff --git a/client/src/client/frame-runner.ts b/client/src/client/frame-runner.ts index 228ec37c3c..fac4fd503a 100644 --- a/client/src/client/frame-runner.ts +++ b/client/src/client/frame-runner.ts @@ -62,7 +62,7 @@ async function initTestFrame(e: InitTestFrameArg = { code: {} }) { Object.freeze(o); Object.getOwnPropertyNames(o).forEach(function (prop) { if ( - o.hasOwnProperty(prop) && + Object.prototype.hasOwnProperty.call(o, prop) && o[prop] !== null && (typeof o[prop] === 'object' || typeof o[prop] === 'function') && !Object.isFrozen(o[prop]) diff --git a/client/src/components/helpers/skeleton-sprite.tsx b/client/src/components/helpers/skeleton-sprite.tsx index d7401b2d2f..27be5bea77 100644 --- a/client/src/components/helpers/skeleton-sprite.tsx +++ b/client/src/components/helpers/skeleton-sprite.tsx @@ -2,10 +2,7 @@ import React from 'react'; import styles from './skeleton-styles'; -// TODO: unsure about parameter typing -function SkeletonSprite({}: React.FC< - React.ComponentPropsWithoutRef<'svg'> ->): JSX.Element { +function SkeletonSprite(): JSX.Element { return (