module.exports = { extends: [ "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended-requiring-type-checking", "react-app", "react-app/jest", "airbnb-typescript", "prettier", "plugin:security/recommended", "plugin:xss/recommended", "plugin:no-unsanitized/DOM" ], plugins: [ "unused-imports", "prettier", "xss", "no-unsanitized" ], ignorePatterns: ["**/dist/**"], rules: { "react/react-in-jsx-scope": 0, "security/detect-object-injection": "off", "security/detect-non-literal-fs-filename": "off" }, parserOptions: { project: true, tsconfigRootDir: ['./tsconfig.eslint.json', './packages/*/tsconfig.json'], }, overrides: [ { files: [ "**/*.ts?(x)", "**/*.js?(x)", "**/*.@(m|c)js" ], rules: { "prettier/prettier": 2, indent: "off", // Let prettier do it curly: "error", "import/prefer-default-export": "off", "class-methods-use-this": "off", "comma-dangle": "off", "max-classes-per-file": "off", "no-shadow": "off", "no-param-reassign": ["error", { props: false }], quotes: [ "error", "double", { "avoidEscape": true, "allowTemplateLiterals": true } ], "@typescript-eslint/no-use-before-define": ["error", { "functions": false, "classes": false, }], "padding-line-between-statements": [ "error", { blankLine: "always", prev: "*", next: "return", }, { blankLine: "always", prev: "*", next: "block-like", }, { blankLine: "always", prev: "*", next: "function", }, { blankLine: "always", prev: "*", next: "class", }, { blankLine: "always", prev: ["const", "let", "var"], next: "*", }, { blankLine: "any", prev: ["const", "let", "var"], next: ["const", "let", "var"], }, ], "import/no-extraneous-dependencies": "off", "jsx-a11y/no-redundant-roles": ["off"], "no-restricted-syntax": [ "error", { selector: "ForInStatement", message: "for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.", }, { selector: "WithStatement", message: "`with` is disallowed in strict mode because it makes code impossible to predict and optimize.", }, ], "max-len": [ "error", 120, 2, { ignoreUrls: true, ignoreComments: false, ignoreRegExpLiterals: true, ignoreStrings: true, ignoreTemplateLiterals: true, }, ], "unused-imports/no-unused-imports-ts": "error", "import/extensions": "off", "linebreak-style": ["error", "unix"], "eol-last": ["error", "always"], "object-shorthand": "error", "prefer-template": "error", "template-curly-spacing": "error", "keyword-spacing": "off", // jest rules "jest/valid-title": "off", // testing-library "testing-library/no-node-access": "off", "testing-library/no-container": "off", "testing-library/prefer-screen-queries": "off", "testing-library/no-render-in-setup": "off", "testing-library/render-result-naming-convention": "off", // Typescript specific rules "@typescript-eslint/ban-types": "off", "@typescript-eslint/ban-ts-comment": "off", "@typescript-eslint/no-empty-interface": "off", "@typescript-eslint/interface-name-prefix": "off", "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/explicit-module-boundary-types": "off", "@typescript-eslint/no-useless-constructor": "off", "@typescript-eslint/comma-dangle": "off", "@typescript-eslint/no-shadow": "off", "@typescript-eslint/quotes": [ "error", "double", { avoidEscape: true, allowTemplateLiterals: true, }, ], "@typescript-eslint/no-unused-expressions": "error", "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/keyword-spacing": "error", "@typescript-eslint/naming-convention": "off", "@typescript-eslint/restrict-template-expressions": [ "error", { allowNumber: true, allowBoolean: true, allowNullish: true, }, ], "@typescript-eslint/no-use-before-define": [ "error", { functions: false, classes: false, } ], // React specific rules "react-hooks/rules-of-hooks": "error", "react-hooks/exhaustive-deps": "off", "react/require-default-props": "off", "react/function-component-definition": "off", "react/prop-types": "off", "react/jsx-filename-extension": [1, { extensions: [".tsx"] }], // jsx-a11y custom components "jsx-a11y/label-has-associated-control": [ 2, { controlComponents: ["Select", "StyledInput", "StyledSlider"], depth: 1, }, ], }, }, ], };