.eslintrc.json•3.42 kB
{
"root": true,
"env": {
"browser": true,
"es2022": true,
"node": true
},
"extends": [
"eslint:recommended",
"@typescript-eslint/recommended",
"@typescript-eslint/recommended-requiring-type-checking",
"plugin:react/recommended",
"plugin:react-hooks/recommended",
"plugin:jsx-a11y/recommended",
"plugin:security/recommended",
"prettier"
],
"ignorePatterns": [
"dist",
"build",
"release",
"node_modules",
".eslintrc.cjs"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 2022,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
},
"project": [
"./tsconfig.json"
],
"tsconfigRootDir": "."
},
"plugins": [
"@typescript-eslint",
"react",
"react-hooks",
"jsx-a11y",
"security"
],
"settings": {
"react": {
"version": "detect"
}
},
"rules": {
// 🔒 セキュリティ強化
"security/detect-object-injection": "error",
"security/detect-non-literal-regexp": "error",
"security/detect-unsafe-regex": "error",
"security/detect-buffer-noassert": "error",
"security/detect-child-process": "error",
"security/detect-disable-mustache-escape": "error",
"security/detect-eval-with-expression": "error",
"security/detect-no-csrf-before-method-override": "error",
"security/detect-non-literal-fs-filename": "error",
"security/detect-pseudoRandomBytes": "error",
// 📊 TypeScript品質強化
"@typescript-eslint/no-unused-vars": [
"error",
{
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"caughtErrorsIgnorePattern": "^_"
}
],
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-non-null-assertion": "error",
"@typescript-eslint/prefer-nullish-coalescing": "error",
"@typescript-eslint/prefer-optional-chain": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/require-await": "error",
// 🎯 コード品質強化
"complexity": [
"error",
{
"max": 10
}
],
"max-lines": [
"error",
{
"max": 300,
"skipBlankLines": true,
"skipComments": true
}
],
"max-lines-per-function": [
"error",
{
"max": 50,
"skipBlankLines": true,
"skipComments": true
}
],
"max-params": [
"error",
4
],
"max-depth": [
"error",
4
],
"no-console": "warn",
"no-debugger": "error",
"no-alert": "error",
"no-var": "error",
"prefer-const": "error",
"prefer-arrow-callback": "error",
// ⚛️ React品質強化
"react/prop-types": "off",
"react/react-in-jsx-scope": "off",
"react/jsx-uses-react": "off",
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": "error",
// ♿ アクセシビリティ強化
"jsx-a11y/alt-text": "error",
"jsx-a11y/aria-props": "error",
"jsx-a11y/aria-proptypes": "error",
"jsx-a11y/aria-unsupported-elements": "error",
"jsx-a11y/role-has-required-aria-props": "error",
"jsx-a11y/role-supports-aria-props": "error",
// 🚫 一般無効化
"no-unused-vars": "off"
}
}