56 lines
1.8 KiB
TypeScript
56 lines
1.8 KiB
TypeScript
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<ReactRulesObject> = {
|
|
'@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<ReactRefreshRulesObject> = {
|
|
'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,
|
|
});
|
|
}
|