import js from '@eslint/js'; import tseslint from 'typescript-eslint'; export default [ js.configs.recommended, ...tseslint.configs.recommended, { files: ['**/*.{js,mjs,cjs,ts,tsx}'], languageOptions: { parser: tseslint.parser, parserOptions: { ecmaVersion: 'latest', sourceType: 'module', ecmaFeatures: { jsx: true, }, }, globals: { // Node.js globals console: 'readonly', process: 'readonly', require: 'readonly', module: 'readonly', exports: 'readonly', __dirname: 'readonly', __filename: 'readonly', global: 'readonly', Buffer: 'readonly', // Browser globals window: 'readonly', document: 'readonly', navigator: 'readonly', location: 'readonly', localStorage: 'readonly', sessionStorage: 'readonly', fetch: 'readonly', Request: 'readonly', Response: 'readonly', Headers: 'readonly', URL: 'readonly', URLSearchParams: 'readonly', FormData: 'readonly', File: 'readonly', FileReader: 'readonly', Blob: 'readonly', Image: 'readonly', HTMLElement: 'readonly', HTMLInputElement: 'readonly', HTMLImageElement: 'readonly', HTMLDivElement: 'readonly', HTMLTextAreaElement: 'readonly', HTMLCanvasElement: 'readonly', HTMLAnchorElement: 'readonly', CanvasRenderingContext2D: 'readonly', Event: 'readonly', CustomEvent: 'readonly', MouseEvent: 'readonly', KeyboardEvent: 'readonly', Element: 'readonly', Node: 'readonly', NodeList: 'readonly', NodeListOf: 'readonly', setTimeout: 'readonly', clearTimeout: 'readonly', setInterval: 'readonly', clearInterval: 'readonly', alert: 'readonly', confirm: 'readonly', prompt: 'readonly', // Web APIs crypto: 'readonly', AbortController: 'readonly', TextEncoder: 'readonly', TextDecoder: 'readonly', performance: 'readonly', requestAnimationFrame: 'readonly', cancelAnimationFrame: 'readonly', PerformanceObserver: 'readonly', PerformanceNavigationTiming: 'readonly', RequestInit: 'readonly', // Node.js types NodeJS: 'readonly', // Geolocation GeoJSON: 'readonly', // React React: 'readonly', }, }, rules: { '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_|^error$' }], '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/no-require-imports': 'off', 'prefer-const': 'error', 'no-console': 'off', 'no-undef': 'error', 'no-empty': 'warn', 'no-useless-catch': 'warn', 'no-constant-binary-expression': 'warn', }, }, { files: ['**/*.astro'], rules: { // Disable parsing for Astro files since ESLint doesn't understand them '@typescript-eslint/no-unused-vars': 'off', 'no-undef': 'off', }, }, { ignores: [ 'dist/', 'node_modules/', '.astro/', 'public/', '*.config.js', '*.config.ts', '*.config.mjs', '**/*.astro', // Skip linting Astro files entirely 'scripts/', 'test-*.js', 'test-*.mjs', 'promote-to-admin.js', 'setup-*.js', ], }, ];