{ "extends": ["@grafana/eslint-config", "plugin:react/jsx-runtime"], "root": true, "plugins": [ "@emotion", "lodash", "jest", "import", "jsx-a11y", "@grafana", "no-barrel-files", // Included so betterer doesn't fail when processing all files, // as other parts of the code use testing-library plugin "testing-library", ], "settings": { "import/internal-regex": "^(app/)|(@grafana)", "import/external-module-folders": ["node_modules", ".yarn"], }, "rules": { "@emotion/syntax-preference": [2, "object"], "@grafana/no-border-radius-literal": "error", "@grafana/no-unreduced-motion": "error", "react/prop-types": "off", // need to ignore emotion's `css` prop, see https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-unknown-property.md#rule-options "react/no-unknown-property": ["error", { "ignore": ["css"] }], "@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": [ "error", { "paths": [ { "name": "react-redux", "importNames": ["useDispatch", "useSelector"], "message": "Please import from app/types instead.", }, { "name": "react-i18next", "importNames": ["Trans", "t"], "message": "Please import from app/core/internationalization instead", }, { "name": "react-router-dom", "message": "Please import from react-router-dom-v5-compat instead" }, { "name": "react-router", "message": "Please import from react-router-dom-v5-compat instead" } ], }, ], // Use typescript's no-redeclare for compatibility with overrides "no-redeclare": "off", "@typescript-eslint/no-redeclare": ["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", }, }, { "extends": ["plugin:jsx-a11y/recommended"], "files": ["**/*.tsx"], "excludedFiles": ["**/*.{spec,test}.tsx"], "rules": { // rules marked "off" are those left in the recommended preset we need to fix // we should remove the corresponding line and fix them one by one // any marked "error" contain specific overrides we'll need to keep "jsx-a11y/no-autofocus": [ "error", { "ignoreNonDOM": true, }, ], "jsx-a11y/label-has-associated-control": [ "error", { "controlComponents": ["NumberInput"], "depth": 2, }, ], }, }, { "files": [ "public/app/plugins/datasource/azuremonitor/*.{ts,tsx}", "public/app/plugins/datasource/azuremonitor/**/*.{ts,tsx}", "public/app/plugins/datasource/cloud-monitoring/*.{ts,tsx}", "public/app/plugins/datasource/cloud-monitoring/**/*.{ts,tsx}", "public/app/plugins/datasource/elasticsearch/*.{ts,tsx}", "public/app/plugins/datasource/elasticsearch/**/*.{ts,tsx}", "public/app/plugins/datasource/grafana-postgresql-datasource/*.{ts,tsx}", "public/app/plugins/datasource/grafana-postgresql-datasource/**/*.{ts,tsx}", "public/app/plugins/datasource/grafana-pyroscope-datasource/*.{ts,tsx}", "public/app/plugins/datasource/grafana-pyroscope-datasource/**/*.{ts,tsx}", "public/app/plugins/datasource/grafana-testdata-datasource/*.{ts,tsx}", "public/app/plugins/datasource/grafana-testdata-datasource/**/*.{ts,tsx}", "public/app/plugins/datasource/jaeger/*.{ts,tsx}", "public/app/plugins/datasource/jaeger/**/*.{ts,tsx}", "public/app/plugins/datasource/loki/*.{ts,tsx}", "public/app/plugins/datasource/loki/**/*.{ts,tsx}", "public/app/plugins/datasource/mysql/*.{ts,tsx}", "public/app/plugins/datasource/mysql/**/*.{ts,tsx}", "public/app/plugins/datasource/parca/*.{ts,tsx}", "public/app/plugins/datasource/parca/**/*.{ts,tsx}", "public/app/plugins/datasource/tempo/*.{ts,tsx}", "public/app/plugins/datasource/tempo/**/*.{ts,tsx}", "public/app/plugins/datasource/loki/*.{ts,tsx}", "public/app/plugins/datasource/loki/**/*.{ts,tsx}", "public/app/plugins/datasource/elasticsearch/*.{ts,tsx}", "public/app/plugins/datasource/elasticsearch/**/*.{ts,tsx}", "public/app/plugins/datasource/cloudwatch/*.{ts,tsx}", "public/app/plugins/datasource/cloudwatch/**/*.{ts,tsx}", "public/app/plugins/datasource/zipkin/*.{ts,tsx}", "public/app/plugins/datasource/zipkin/**/*.{ts,tsx}", ], "settings": { "import/resolver": { "node": { "extensions": [".ts", ".tsx"], }, }, }, "rules": { "import/no-restricted-paths": [ "error", { "zones": [ { "target": "./public/app/plugins", "from": "./public", "except": ["./app/plugins"], "message": "Core plugins are not allowed to depend on Grafana core packages", }, ], }, ], }, }, ], }