import js from '@eslint/js'; import typescript from '@typescript-eslint/eslint-plugin'; import typescriptParser from '@typescript-eslint/parser'; import react from 'eslint-plugin-react'; import reactHooks from 'eslint-plugin-react-hooks'; import prettier from 'eslint-plugin-prettier'; export default [ js.configs.recommended, // TypeScript and React files (browser environment) { files: ['**/*.{ts,tsx}'], languageOptions: { parser: typescriptParser, parserOptions: { ecmaVersion: 'latest', sourceType: 'module', ecmaFeatures: { jsx: true }, }, globals: { // Browser globals window: 'readonly', document: 'readonly', console: 'readonly', setTimeout: 'readonly', clearTimeout: 'readonly', setInterval: 'readonly', clearInterval: 'readonly', fetch: 'readonly', URLSearchParams: 'readonly', Map: 'readonly', Set: 'readonly', Promise: 'readonly', navigator: 'readonly', localStorage: 'readonly', crypto: 'readonly', CryptoKey: 'readonly', TextEncoder: 'readonly', TextDecoder: 'readonly', Uint8Array: 'readonly', ArrayBuffer: 'readonly', btoa: 'readonly', atob: 'readonly', BigInt: 'readonly', URL: 'readonly', Blob: 'readonly', File: 'readonly', FileReader: 'readonly', FormData: 'readonly', Headers: 'readonly', Request: 'readonly', Response: 'readonly', AbortController: 'readonly', AbortSignal: 'readonly', Event: 'readonly', CustomEvent: 'readonly', EventTarget: 'readonly', MutationObserver: 'readonly', ResizeObserver: 'readonly', IntersectionObserver: 'readonly', requestAnimationFrame: 'readonly', cancelAnimationFrame: 'readonly', performance: 'readonly', queueMicrotask: 'readonly', structuredClone: 'readonly', indexedDB: 'readonly', IDBDatabase: 'readonly', // Import.meta for Vite ImportMeta: 'readonly', }, }, plugins: { '@typescript-eslint': typescript, react, 'react-hooks': reactHooks, prettier, }, settings: { react: { version: 'detect' }, }, rules: { ...typescript.configs.recommended.rules, ...react.configs.recommended.rules, ...reactHooks.configs.recommended.rules, 'react/react-in-jsx-scope': 'off', 'react/prop-types': 'off', '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], 'prettier/prettier': 'error', 'no-console': ['warn', { allow: ['warn', 'error'] }], // Additional rules for better code quality '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/no-non-null-assertion': 'warn', 'react/display-name': 'off', 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn', }, }, // Node.js script files (CommonJS - .js) { files: ['scripts/**/*.js'], languageOptions: { ecmaVersion: 'latest', sourceType: 'commonjs', globals: { // Node.js globals process: 'readonly', console: 'readonly', __dirname: 'readonly', __filename: 'readonly', module: 'readonly', require: 'readonly', exports: 'readonly', Buffer: 'readonly', setTimeout: 'readonly', setInterval: 'readonly', clearTimeout: 'readonly', clearInterval: 'readonly', setImmediate: 'readonly', clearImmediate: 'readonly', URL: 'readonly', URLSearchParams: 'readonly', Promise: 'readonly', Map: 'readonly', Set: 'readonly', BigInt: 'readonly', TextEncoder: 'readonly', TextDecoder: 'readonly', }, }, rules: { 'no-console': 'off', // Allow console in scripts 'no-undef': 'error', }, }, // Node.js script files (ES Modules - .mjs) { files: ['scripts/**/*.mjs'], languageOptions: { ecmaVersion: 'latest', sourceType: 'module', globals: { // Node.js globals process: 'readonly', console: 'readonly', Buffer: 'readonly', setTimeout: 'readonly', setInterval: 'readonly', clearTimeout: 'readonly', clearInterval: 'readonly', setImmediate: 'readonly', clearImmediate: 'readonly', URL: 'readonly', URLSearchParams: 'readonly', Promise: 'readonly', Map: 'readonly', Set: 'readonly', BigInt: 'readonly', TextEncoder: 'readonly', TextDecoder: 'readonly', fetch: 'readonly', }, }, rules: { 'no-console': 'off', // Allow console in scripts 'no-undef': 'error', }, }, // Ignore patterns { ignores: [ 'dist/**', 'node_modules/**', 'coverage/**', 'supabase/functions/**', // Deno runtime, different globals '*.config.js', '*.config.ts', '.*.js', '.*.cjs', ], }, ];