eslint.config.mjs (3032B)
1 // This file has been placed into the public domain. 2 3 import { createRequire } from "node:module"; 4 const require = createRequire(import.meta.url); 5 6 import { dirname, join } from "node:path"; 7 import { fileURLToPath } from "node:url"; 8 9 const __dirname = dirname(fileURLToPath(import.meta.url)); 10 11 const resolve = (pkg) => { 12 const qaToolingDir = join(__dirname, "packages/qa-tooling"); 13 try { 14 return require.resolve(pkg, { paths: [qaToolingDir] }); 15 } catch { 16 return pkg; 17 } 18 }; 19 20 const eslint = require(resolve("@eslint/js")); 21 const tseslint = require(resolve("typescript-eslint")); 22 const reactPlugin = require(resolve("eslint-plugin-react")); 23 const reactHooksPlugin = require(resolve("eslint-plugin-react-hooks")); 24 const importPlugin = require(resolve("eslint-plugin-import")); 25 const jsxA11yPlugin = require(resolve("eslint-plugin-jsx-a11y")); 26 const headerPlugin = require(resolve("eslint-plugin-header")); 27 const prettierConfig = require(resolve("eslint-config-prettier")); 28 const globals = require(resolve("globals")); 29 30 export default tseslint.config( 31 { 32 ignores: [ 33 "prebuilt/**", 34 "**/dist/**", 35 "**/lib/**", 36 "**/node_modules/**", 37 "**/vendor/**", 38 "**/tsconfig.tsbuildinfo", 39 "**/.eslintrc.js", 40 "**/.eslintrc.cjs", 41 ], 42 }, 43 eslint.configs.recommended, 44 ...tseslint.configs.recommended, 45 { 46 files: ["**/*.{ts,tsx,js,jsx}"], 47 plugins: { 48 react: reactPlugin, 49 "react-hooks": reactHooksPlugin, 50 "jsx-a11y": jsxA11yPlugin, 51 import: importPlugin, 52 header: headerPlugin, 53 }, 54 languageOptions: { 55 globals: { 56 ...globals.browser, 57 ...globals.node, 58 ...globals.es2021, 59 }, 60 parserOptions: { 61 ecmaVersion: "latest", 62 sourceType: "module", 63 ecmaFeatures: { 64 jsx: true, 65 }, 66 }, 67 }, 68 settings: { 69 react: { 70 version: "18.0", 71 pragma: "h", 72 }, 73 }, 74 rules: { 75 ...reactPlugin.configs.recommended.rules, 76 ...reactHooksPlugin.configs.recommended.rules, 77 ...jsxA11yPlugin.configs.recommended.rules, 78 "no-constant-condition": ["error", { checkLoops: false }], 79 "prefer-const": ["warn", { destructuring: "all" }], 80 "no-prototype-builtins": "off", 81 "@typescript-eslint/no-namespace": "off", 82 "@typescript-eslint/no-explicit-any": "off", 83 "@typescript-eslint/ban-ts-comment": "off", 84 "@typescript-eslint/no-unused-vars": ["warn", { args: "none" }], 85 "@typescript-eslint/explicit-function-return-type": [ 86 "warn", 87 { allowExpressions: true }, 88 ], 89 "@typescript-eslint/no-use-before-define": [ 90 "error", 91 { functions: false, classes: false }, 92 ], 93 "import/extensions": ["error", "ignorePackages"], 94 "react/no-unknown-property": 0, 95 "react/prop-types": 0, 96 "react/no-unescaped-entities": 0, 97 }, 98 }, 99 { 100 files: ["**/*.js", "**/*.mjs", "**/*.cjs"], 101 ...tseslint.configs.disableTypeChecked, 102 }, 103 prettierConfig, 104 );