import js from '@eslint/js' import tsParser from '@typescript-eslint/parser' import tsPlugin from '@typescript-eslint/eslint-plugin' import react from 'eslint-plugin-react' import next from '@next/eslint-plugin-next' export default [ // Global ignores (flat config) { ignores: [ '**/node_modules/**', '.next/**', 'public/datasheets/**', 'data/**', // Scripts + config files are not part of the frontend lint target. 'scripts/**', 'next.config.*', 'postcss.config.js', 'tailwind.config.*', 'eslint.config.js', ], }, js.configs.recommended, { // Only lint the actual source files, not build output or scripts files: ['app/**/*.{ts,tsx}', 'components/**/*.{ts,tsx}', 'lib/**/*.{ts,tsx}'], languageOptions: { parser: tsParser, parserOptions: { ecmaVersion: 2020, sourceType: 'module', ecmaFeatures: { jsx: true } }, globals: { // Browser globals window: 'readonly', document: 'readonly', navigator: 'readonly', localStorage: 'readonly', setTimeout: 'readonly', clearTimeout: 'readonly', setInterval: 'readonly', clearInterval: 'readonly', fetch: 'readonly', URL: 'readonly', URLSearchParams: 'readonly', DOMParser: 'readonly', HTMLInputElement: 'readonly', HTMLTextAreaElement: 'readonly', HTMLSelectElement: 'readonly', HTMLButtonElement: 'readonly', HTMLDivElement: 'readonly', HTMLLabelElement: 'readonly', HTMLSourceElement: 'readonly', HTMLFormElement: 'readonly', HTMLElement: 'readonly', HTMLVideoElement: 'readonly', Node: 'readonly', Event: 'readonly', alert: 'readonly', console: 'readonly', // Node globals process: 'readonly', Buffer: 'readonly', __dirname: 'readonly', __filename: 'readonly', require: 'readonly', module: 'readonly', NodeJS: 'readonly', // React/Next.js globals React: 'readonly', JSX: 'readonly' } }, plugins: { '@typescript-eslint': tsPlugin, 'react': react, '@next/next': next }, rules: { ...tsPlugin.configs.recommended.rules, ...react.configs.recommended.rules, ...next.configs.recommended.rules, ...next.configs['core-web-vitals'].rules, // TypeScript specific '@typescript-eslint/no-unused-vars': 'warn', '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/no-empty-interface': 'off', '@typescript-eslint/ban-ts-comment': 'off', '@typescript-eslint/no-namespace': 'off', // React specific 'react/react-in-jsx-scope': 'off', 'react/prop-types': 'off', 'react/no-unescaped-entities': 'off', // Next.js specific '@next/next/no-img-element': 'off', '@next/next/no-html-link-for-pages': 'off', '@next/next/no-sync-scripts': 'off', // General 'no-undef': 'error', 'no-console': 'off', 'no-useless-escape': 'warn', 'no-irregular-whitespace': 'warn' }, settings: { react: { version: 'detect' } } }, { // Ignore scripts and test files completely files: ['scripts/**/*.{js,ts}', 'test-*.{js,ts}', '**/*.test.{js,ts,tsx}'], rules: { 'no-undef': 'off', 'no-unused-vars': 'off', 'no-console': 'off' } }, { // Ignore build output and config files files: ['.next/**', 'next.config.ts', 'postcss.config.js', 'tailwind.config.js', 'eslint.config.js'], rules: { 'no-undef': 'off', 'no-unused-vars': 'off' } } ]