import { FlatCompat } from '@eslint/eslintrc'; import pluginJs from '@eslint/js'; import pluginVue from 'eslint-plugin-vue'; import globals from 'globals'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import tseslint from 'typescript-eslint'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const compat = new FlatCompat({ baseDirectory: __dirname, }); export default [ { languageOptions: { globals: globals.browser } }, pluginJs.configs.recommended, ...tseslint.configs.recommended, ...pluginVue.configs['flat/recommended'], ...compat.extends('@vue/eslint-config-typescript/recommended'), ...compat.extends('@vue/eslint-config-prettier'), { languageOptions: { parserOptions: { parser: '@typescript-eslint/parser', }, }, rules: { // // disable eslint no-shadow as it's causing false positives on typescript enums // 'no-shadow': 'off', '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', caughtErrors: 'all', caughtErrorsIgnorePattern: '^err|^error', }, ], // Custom vue rules 'vue/block-lang': [ 'error', { script: { lang: 'ts', }, }, ], }, }, { rules: { 'vue/component-api-style': ['error'], 'vue/component-name-in-template-casing': [ 'error', 'PascalCase', { registeredComponentsOnly: false, ignores: ['/i-mdi-.*/'] }, ], 'vue/block-lang': [ 'error', { script: { lang: 'ts', }, }, ], 'vue/define-emits-declaration': ['error'], 'vue/enforce-style-attribute': ['error'], 'vue/block-order': [ 'error', { order: ['script', 'template', 'style'], }, ], }, }, ];