import js from "@eslint/js"; import globals from "globals"; 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"] }, { extends: [js.configs.recommended, ...tseslint.configs.recommended], files: ["**/*.{ts,tsx}"], languageOptions: { ecmaVersion: 2020, globals: globals.browser, }, plugins: { "react-hooks": reactHooks, "react-refresh": reactRefresh, }, rules: { ...reactHooks.configs.recommended.rules, "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], "@typescript-eslint/no-unused-vars": "off", "no-restricted-imports": [ "error", { paths: [ { name: "@/app/App", message: "Removed duplicate app shell; use src/App.tsx (see main.tsx). Do not reintroduce a second QueryClient entrypoint.", }, { name: "@/src/app/App", message: "Removed duplicate app shell; use src/App.tsx (see main.tsx). Do not reintroduce a second QueryClient entrypoint.", }, ], }, ], }, }, /** * Guard: JSX is not allowed in `.ts` files (rename to `.tsx`). * The typescript-eslint parser natively refuses to parse JSX in `.ts` files, * so this `no-restricted-syntax` rule acts as an extra safety net with a * friendlier message when another config/plugin re-enables JSX parsing. */ { files: ["**/*.ts"], ignores: ["**/*.tsx"], rules: { "no-restricted-syntax": [ "error", { selector: "JSXElement", message: "JSX is not allowed in .ts files. Rename the file to .tsx.", }, { selector: "JSXFragment", message: "JSX is not allowed in .ts files. Rename the file to .tsx.", }, ], }, }, );