import pluginImport from 'eslint-plugin-import'; import { globalIgnores } from 'eslint/config'; import { defineConfigWithVueTs, vueTsConfigs, configureVueProject, } from '@vue/eslint-config-typescript'; import pluginVue from 'eslint-plugin-vue'; import pluginVitest from '@vitest/eslint-plugin'; import pluginPlaywright from 'eslint-plugin-playwright'; import pluginOxlint from 'eslint-plugin-oxlint'; import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'; configureVueProject({ scriptLangs: ['ts', 'tsx'] }); // More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup export default defineConfigWithVueTs( { name: 'app/files-to-lint', files: ['**/*.{ts,mts,tsx,vue}'], }, globalIgnores(['worker-configuration.d.ts', '**/dist/**', '**/dist-ssr/**', '**/coverage/**']), pluginVue.configs['flat/essential'], vueTsConfigs.recommended, { ...pluginVitest.configs.recommended, files: ['src/**/__tests__/*'], }, { ...pluginPlaywright.configs['flat/recommended'], files: ['e2e/**/*.{test,spec}.{js,ts,jsx,tsx}'], }, ...pluginOxlint.configs['flat/recommended'], { plugins: { import: pluginImport, }, rules: { 'import/first': 'error', 'import/no-duplicates': 'error', 'import/newline-after-import': 'error', 'import/no-mutable-exports': 'error', 'import/no-named-default': 'error', 'import/no-self-import': 'error', 'import/no-unresolved': 'off', 'import/no-webpack-loader-syntax': 'error', 'import/consistent-type-specifier-style': ['error', 'prefer-top-level'], }, }, { rules: { '@typescript-eslint/no-explicit-any': 'off', 'vue/block-order': [ 'error', { order: ['script', 'template', 'style'], }, ], 'vue/define-macros-order': [ 'error', { order: ['defineOptions', 'defineModel', 'defineProps', 'defineEmits', 'defineSlots'] }, ], 'vue/attributes-order': 'error', 'vue/multi-word-component-names': 'off', }, }, skipFormatting, );