Files
klz-cables.com/eslint.config.js
2026-01-06 22:12:29 +01:00

136 lines
3.8 KiB
JavaScript

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'
}
}
]