import eslintJs from '@eslint/js'; import tseslint from 'typescript-eslint'; import solid from 'eslint-plugin-solid'; import type { ConfigWithExtends } from 'typescript-eslint'; import prettier from 'eslint-plugin-prettier/recommended'; // tseslint.config() is the correct entry point for this version of typescript-eslint. // ESLint's own defineConfig() is not compatible with typescript-eslint's typed config // spreads yet (type mismatch between @typescript-eslint/utils and @eslint/core internals). // eslint-disable-next-line @typescript-eslint/no-deprecated export default tseslint.config( // Base JS recommended rules eslintJs.configs.recommended, // TypeScript strict + stylistic best-practice rules ...tseslint.configs.strictTypeChecked, ...tseslint.configs.stylisticTypeChecked, // Solid.js TypeScript rules // Cast required: eslint-plugin-solid uses older RuleModule types than ESLint core solid.configs['flat/typescript'] as ConfigWithExtends, // Prettier: disables formatting rules that conflict, then enforces prettier prettier, // Project-wide settings { languageOptions: { parserOptions: { projectService: true, tsconfigRootDir: import.meta.dirname, }, }, }, // Custom rule overrides { rules: { // Treat deprecated APIs as errors '@typescript-eslint/no-deprecated': 'error', // Best-practice TypeScript rules '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/consistent-type-imports': [ 'error', { prefer: 'type-imports', fixStyle: 'separate-type-imports' }, ], '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, ], 'no-console': 'error', eqeqeq: ['error', 'always'], 'no-var': 'error', 'prefer-const': 'error', // Prettier formatting as errors 'prettier/prettier': 'error', }, }, // Ignore build artifacts and dependencies { ignores: ['node_modules/**'], }, );