www/.eslint/react.ts
2025-06-02 13:11:57 +12:00

56 lines
1.5 KiB
TypeScript

import { type Linter } from 'eslint'
import react from 'eslint-plugin-react'
import * as reactHooks from 'eslint-plugin-react-hooks'
import { javascriptFiles, typescriptFiles } from './shared'
export const reactConfig: Linter.Config = {
name: 'eslint/react',
files: [
...typescriptFiles.filter(f => f.includes('tsx')),
...javascriptFiles.filter(f => f.includes('jsx')),
],
plugins: {
react,
},
rules: {
...react.configs.recommended.rules,
'react/react-in-jsx-scope': 'off', // Not needed in React 17+
'react/prop-types': 'off', // Using TypeScript
'react/jsx-uses-react': 'off',
'react/jsx-uses-vars': 'error',
'react/no-unescaped-entities': 'off',
'react/jsx-key': 'error',
'react/jsx-no-useless-fragment': 'error',
'react/self-closing-comp': 'error',
'react/jsx-boolean-value': ['error', 'never'],
'react/jsx-curly-brace-presence': ['error', { props: 'never', children: 'never' }],
'react/function-component-definition': [
'error',
{
namedComponents: 'arrow-function',
unnamedComponents: 'arrow-function',
},
],
},
settings: {
react: {
version: '18.2', // React version
},
},
}
export const reactHooksConfig: Linter.Config = {
name: 'eslint/react-hooks',
files: [
...typescriptFiles.filter(f => f.includes('tsx')),
...javascriptFiles.filter(f => f.includes('jsx')),
],
plugins: {
'react-hooks': reactHooks,
},
rules: {
...reactHooks.configs.recommended.rules,
},
}