eslint.config.mjs (109 lines of code) (raw):
import path from 'node:path'
import {fileURLToPath} from 'node:url'
import tseslint from 'typescript-eslint'
import reactHooks from 'eslint-plugin-react-hooks'
// For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format
import storybook from 'eslint-plugin-storybook'
import {fixupConfigRules} from '@eslint/compat'
import {FlatCompat} from '@eslint/eslintrc'
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'
import consts from '@jetbrains/eslint-config/consts.js'
import js from '@eslint/js'
import globals from 'globals'
const {error, ignore} = consts
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
})
const jetbrainsConfigRules = compat.extends(
'@jetbrains',
'@jetbrains/eslint-config/es6',
'@jetbrains/eslint-config/browser',
'@jetbrains/eslint-config/react',
)
// Remove conflicting react-hooks plugin from JetBrains config
jetbrainsConfigRules.forEach(config => {
if (config.plugins?.['react-hooks']) {
delete config.plugins['react-hooks']
}
})
export default tseslint.config(
{
ignores: ['**/dist', '**/*.d.ts', '**/storybook-static'],
},
...fixupConfigRules(jetbrainsConfigRules),
reactHooks.configs.flat['recommended-latest'],
tseslint.configs.recommended,
eslintPluginPrettierRecommended,
{
rules: {
'@typescript-eslint/consistent-type-imports': error,
'@typescript-eslint/no-unused-vars': [
error,
{caughtErrors: 'none', destructuredArrayIgnorePattern: '^_'},
],
'no-magic-numbers': ignore,
'@typescript-eslint/no-magic-numbers': [
error,
{
ignore: [-1, 0, 1],
ignoreEnums: true,
},
],
'import/extensions': [
error,
'always',
{
js: 'never',
ts: 'never',
tsx: 'never',
},
],
'import/no-cycle': error,
'import/no-extraneous-dependencies': [
error,
{
devDependencies: [
'eslint.config.mjs',
'vite.config.mjs',
'**/*.stories.tsx',
'.storybook/**',
'tsc-teamcity.js',
],
peerDependencies: true,
},
],
'react/jsx-uses-react': ignore,
'react/react-in-jsx-scope': ignore,
complexity: ignore,
},
settings: {
'import/resolver': {
typescript: true,
node: true,
},
'import/core-modules': ['typescript-eslint'],
},
},
...[
...fixupConfigRules(compat.extends('@jetbrains/eslint-config/node')),
{rules: {'import/no-commonjs': ignore, '@typescript-eslint/no-require-imports': ignore}},
].map(config => ({
...config,
files: ['*.config.js', 'browserslist/index.js', 'getWebpackConfig.js', 'tsc-teamcity.js'],
})),
{
files: ['**/*.mjs'],
rules: {'import/extensions': ignore},
},
{
files: ['**/*.test.ts'],
languageOptions: {
globals: globals.jest,
},
},
storybook.configs['flat/recommended'],
)