import type { ReactRulesObject } from '@aet/eslint-define-config/src/rules/react'; import type { ReactRefreshRulesObject } from '@aet/eslint-define-config/src/rules/react-refresh'; import type { Linter, ESLint } from 'eslint'; import { error, off, warn } from '../constants'; import { def } from '../middleware'; import { defineConfig } from '../types'; const reactRules: Partial = { '@eslint-react/no-missing-component-display-name': off, '@eslint-react/no-children-prop': error, '@eslint-react/no-leaked-conditional-rendering': error, '@eslint-react/prefer-read-only-props': off, '@eslint-react/hooks-extra/no-direct-set-state-in-use-effect': off, }; export async function react() { const reactPlugin = def(await import('@eslint-react/eslint-plugin')); const a11y = def(await import('../../packages/eslint-plugin-jsx-a11y/src/index')); const hooks = await import('../../packages/eslint-plugin-react-hooks'); return defineConfig([ reactPlugin.configs['recommended-type-checked'] as unknown as Linter.Config, hooks.flatConfigs.recommended, a11y.flatConfigs.recommended, { name: 'eslint-rules/react', files: ['**/*.tsx'], rules: reactRules, }, { name: 'eslint-rules/react/test-files', files: ['**/*.test.tsx'], rules: { '@eslint-react/no-clone-element': off, '@eslint-react/no-create-ref': off, }, }, ]); } const refreshRules: Partial = { 'react-refresh/only-export-components': [warn, { allowConstantExport: true }], }; export async function reactRefresh() { const refreshPlugin = def(await import('eslint-plugin-react-refresh')); return defineConfig({ name: 'eslint-rules/react-refresh', plugins: { 'react-refresh': refreshPlugin as unknown as ESLint.Plugin, }, rules: refreshRules, }); }