import js from "@eslint/js";
import globals from "globals";
import react from "eslint-plugin-react";
import reactHooks from "eslint-plugin-react-hooks";
import reactRefresh from "eslint-plugin-react-refresh";
import tseslint from "typescript-eslint";
export default tseslint.config(
{
ignores: [
"dist",
"e2e/**",
"*.config.ts",
"*.config.js",
"*.config.cjs",
"env.d.ts",
"**/*.test.ts",
"**/*.test.tsx",
],
},
// TypeScript files with type-aware linting
{
files: ["**/*.{ts,tsx}"],
extends: [js.configs.recommended, ...tseslint.configs.recommended],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
parserOptions: {
ecmaVersion: "latest",
ecmaFeatures: { jsx: true },
sourceType: "module",
project: true,
tsconfigRootDir: import.meta.dirname,
},
},
settings: { react: { version: "18.3" } },
plugins: {
react,
"react-hooks": reactHooks,
"react-refresh": reactRefresh,
},
rules: {
...react.configs.recommended.rules,
...react.configs["jsx-runtime"].rules,
...reactHooks.configs.recommended.rules,
"react/jsx-no-target-blank": "off",
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
"react/prop-types": "off",
// Disabled: return types are inferrable and this is a React app
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/no-unused-vars": [
"warn",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
caughtErrorsIgnorePattern: "^_",
},
],
"@typescript-eslint/switch-exhaustiveness-check": [
"error",
{
allowDefaultCaseForExhaustiveSwitch: true,
considerDefaultExhaustiveForUnions: true,
},
],
"@typescript-eslint/no-misused-promises": [
"error",
{ checksVoidReturn: { arguments: false, attributes: false } },
],
// React-specific: disable unescaped entities rule as it's too strict for JSX
"react/no-unescaped-entities": "off",
// Allow empty interfaces that extend other interfaces (common in React prop patterns)
"@typescript-eslint/no-empty-object-type": "off",
},
},
// Allow non-component exports in component files (shadcn/ui variants, column definitions, validators)
{
files: [
"src/components/ui/**/*.{ts,tsx}",
"src/components/tools/ToolGroupSheet.tsx",
"src/components/tools/ToolsTable.tsx",
],
rules: {
"react-refresh/only-export-components": "off",
},
},
// JavaScript files (legacy shadcn/ui components)
{
files: ["**/*.{js,jsx}"],
extends: [js.configs.recommended],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
parserOptions: {
ecmaVersion: "latest",
ecmaFeatures: { jsx: true },
sourceType: "module",
},
},
settings: { react: { version: "18.3" } },
plugins: {
react,
"react-hooks": reactHooks,
"react-refresh": reactRefresh,
},
rules: {
...react.configs.recommended.rules,
...react.configs["jsx-runtime"].rules,
...reactHooks.configs.recommended.rules,
"react/jsx-no-target-blank": "off",
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
// Disable prop-types for JSX files - this is a TypeScript project
// and JSX files are legacy shadcn/ui components
"react/prop-types": "off",
},
},
);