import js from '@eslint/js' import pluginVue from 'eslint-plugin-vue' import tseslint from 'typescript-eslint' import vueParser from 'vue-eslint-parser' import globals from 'globals' export default [ // Ignore patterns { ignores: ['dist/**', 'node_modules/**', '*.d.ts', 'src/types/*.d.ts'], }, // Base JavaScript rules js.configs.recommended, // TypeScript rules ...tseslint.configs.recommended, // Vue rules ...pluginVue.configs['flat/recommended'], // Global language options for all files { languageOptions: { globals: { ...globals.browser, ...globals.node, }, }, }, // Vue-specific parser configuration { files: ['**/*.vue'], languageOptions: { parser: vueParser, parserOptions: { parser: tseslint.parser, ecmaVersion: 'latest', sourceType: 'module', }, }, }, // TypeScript files { files: ['**/*.ts', '**/*.tsx'], languageOptions: { parser: tseslint.parser, parserOptions: { ecmaVersion: 'latest', sourceType: 'module', }, }, }, // Node.js config files (allow require) { files: ['*.js', '*.cjs', 'src/test/**/*.js'], rules: { '@typescript-eslint/no-require-imports': 'off', }, }, // Custom rules { rules: { // Vue rules 'vue/multi-word-component-names': 'off', 'vue/no-v-html': 'warn', 'vue/require-default-prop': 'off', 'vue/require-prop-types': 'off', 'vue/html-self-closing': [ 'error', { html: { void: 'always', normal: 'always', component: 'always', }, svg: 'always', math: 'always', }, ], // TypeScript rules '@typescript-eslint/no-unused-vars': [ 'warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, ], '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', // General rules 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'prefer-const': 'error', 'no-var': 'error', }, }, ]