{ "extends": ["@grafana/eslint-config"], "root": true, "plugins": ["@emotion", "lodash", "jest", "import", "jsx-a11y"], "settings": { "import/internal-regex": "^(app/)|(@grafana)", "import/external-module-folders": ["node_modules", ".yarn"] }, "rules": { "react/prop-types": "off", "@emotion/jsx-import": "error", "lodash/import-scope": [2, "member"], "jest/no-focused-tests": "error", "import/order": [ "error", { "groups": [["builtin", "external"], "internal", "parent", "sibling", "index"], "newlines-between": "always", "alphabetize": { "order": "asc" } } ], "no-restricted-imports": [ "warn", { "paths": [ { "name": "react-redux", "importNames": ["useDispatch", "useSelector"], "message": "Please import from app/types instead." } ] } ], // Use typescript's no-redeclare for compatibility with overrides "no-redeclare": "off", "@typescript-eslint/no-redeclare": ["error"], // these are all the rules listed in the strict preset // we should fix them one by one and mark them as errors // once they're all fixed, we can remove them all and instead extend the strict preset // with "extends": ["plugin:jsx-a11y/strict"] "jsx-a11y/alt-text": "off", "jsx-a11y/anchor-has-content": "error", "jsx-a11y/anchor-is-valid": "off", "jsx-a11y/aria-activedescendant-has-tabindex": "error", "jsx-a11y/aria-props": "error", "jsx-a11y/aria-proptypes": "error", "jsx-a11y/aria-role": "error", "jsx-a11y/aria-unsupported-elements": "error", "jsx-a11y/autocomplete-valid": "error", "jsx-a11y/click-events-have-key-events": "off", "jsx-a11y/heading-has-content": "error", "jsx-a11y/html-has-lang": "error", "jsx-a11y/iframe-has-title": "off", "jsx-a11y/img-redundant-alt": "error", "jsx-a11y/interactive-supports-focus": [ "off", { "tabbable": [ "button", "checkbox", "link", "progressbar", "searchbox", "slider", "spinbutton", "switch", "textbox" ] } ], "jsx-a11y/label-has-associated-control": "off", "jsx-a11y/media-has-caption": "error", "jsx-a11y/mouse-events-have-key-events": "off", "jsx-a11y/no-access-key": "error", "jsx-a11y/no-autofocus": "off", "jsx-a11y/no-distracting-elements": "error", "jsx-a11y/no-interactive-element-to-noninteractive-role": "error", "jsx-a11y/no-noninteractive-element-interactions": [ "off", { "body": ["onError", "onLoad"], "iframe": ["onError", "onLoad"], "img": ["onError", "onLoad"] } ], "jsx-a11y/no-noninteractive-element-to-interactive-role": "off", "jsx-a11y/no-noninteractive-tabindex": "off", "jsx-a11y/no-redundant-roles": "error", "jsx-a11y/no-static-element-interactions": "off", "jsx-a11y/role-has-required-aria-props": "error", "jsx-a11y/role-supports-aria-props": "error", "jsx-a11y/scope": "error", "jsx-a11y/tabindex-no-positive": "error" }, "overrides": [ { "files": ["packages/grafana-ui/src/components/uPlot/**/*.{ts,tsx}"], "rules": { "react-hooks/rules-of-hooks": "off", "react-hooks/exhaustive-deps": "off" } }, { "files": ["packages/grafana-ui/src/components/ThemeDemos/**/*.{ts,tsx}"], "rules": { "@emotion/jsx-import": "off", "react/jsx-uses-react": "off", "react/react-in-jsx-scope": "off" } }, { "files": ["public/dashboards/scripted*.js"], "rules": { "no-redeclare": "error", "@typescript-eslint/no-redeclare": "off" } } ] }