import js from '@eslint/js'; import tseslint from 'typescript-eslint'; import reactPlugin from 'eslint-plugin-react'; import reactHooks from 'eslint-plugin-react-hooks'; import importPlugin from 'eslint-plugin-import'; import unicorn from 'eslint-plugin-unicorn'; import jsxA11y from 'eslint-plugin-jsx-a11y'; import prettierPlugin from 'eslint-plugin-prettier'; import prettierConfig from 'eslint-config-prettier'; const tsProject = ['./tsconfig.eslint.json']; export default tseslint.config( { ignores: ['dist/**', 'release/**', 'node_modules/**', '.cursor/**', 'scripts/**', 'eslint.config.js'], }, js.configs.recommended, ...tseslint.configs.strictTypeChecked, ...tseslint.configs.stylisticTypeChecked, { files: ['**/*.{ts,tsx}'], languageOptions: { parserOptions: { project: tsProject, tsconfigRootDir: import.meta.dirname, }, }, plugins: { react: reactPlugin, 'react-hooks': reactHooks, import: importPlugin, unicorn, 'jsx-a11y': jsxA11y, prettier: prettierPlugin, }, settings: { react: { version: 'detect' }, 'import/resolver': { typescript: true, node: true }, }, rules: { ...reactPlugin.configs.recommended.rules, ...reactHooks.configs.recommended.rules, ...jsxA11y.configs.recommended.rules, ...prettierConfig.rules, 'prettier/prettier': 'error', '@typescript-eslint/no-floating-promises': 'error', '@typescript-eslint/no-misused-promises': 'error', '@typescript-eslint/no-unnecessary-condition': 'error', '@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }], '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/consistent-type-definitions': 'off', '@typescript-eslint/no-confusing-void-expression': 'off', 'import/first': 'error', 'import/no-duplicates': 'error', 'import/order': [ 'error', { 'newlines-between': 'always', alphabetize: { order: 'asc', caseInsensitive: true }, }, ], 'unicorn/filename-case': [ 'error', { cases: { camelCase: true, pascalCase: true, kebabCase: true, }, }, ], 'unicorn/prefer-node-protocol': 'error', }, }, { files: ['app/renderer/shared/effects/PxiEffectsOverlay.tsx'], rules: { '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-unsafe-argument': 'off', '@typescript-eslint/no-unsafe-assignment': 'off', '@typescript-eslint/no-unsafe-call': 'off', '@typescript-eslint/no-unsafe-member-access': 'off', '@typescript-eslint/no-unsafe-return': 'off', '@typescript-eslint/no-unnecessary-condition': 'off', '@typescript-eslint/no-unnecessary-type-assertion': 'off', '@typescript-eslint/prefer-nullish-coalescing': 'off', '@typescript-eslint/restrict-plus-operands': 'off', '@typescript-eslint/restrict-template-expressions': 'off', '@typescript-eslint/no-redundant-type-constituents': 'off', }, }, );