/* MORE: https://juejin.cn/post/7403244457263628300#heading-11 */ import pluginVitest from '@vitest/eslint-plugin'; import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'; import { configureVueProject, defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'; import { flatConfigs as eslintPluginImportX_flatConfigs } from 'eslint-plugin-import-x'; import oxlint from 'eslint-plugin-oxlint'; import perfectionist from 'eslint-plugin-perfectionist'; import eslintPluginUnicorn from 'eslint-plugin-unicorn'; import pluginVue from 'eslint-plugin-vue'; // https://github.com/vuejs/eslint-config-typescript/#advanced-setup configureVueProject({ scriptLangs: ['ts', 'tsx', 'js', 'jsx'] }); const _ignores = [ // >>> // eslint-disable-next-line unicorn/no-await-expression-member (await import('@eslint/compat')).includeIgnoreFile( // eslint-disable-next-line unicorn/import-style, unicorn/no-await-expression-member (await import('node:path')).default.resolve(import.meta.dirname, '.gitignore'), ), // <<< // >>> // eslint-disable-next-line unicorn/no-await-expression-member (await import('eslint/config')).globalIgnores([ '**/dist/**', '**/dist-ssr/**', '**/coverage/**', 'auto-imports.d.ts', 'components.d.ts', 'typed-router.d.ts', // .oxlintrc.json > ignorePatterns >>> 'src/shadcn/**', 'src/components/InspiraUI/**', 'public/**', '**/**.no-lint.ts', '**/**.nolint.ts', // <<< .oxlintrc.json ]), // <<< ]; export default defineConfigWithVueTs( { name: 'app/files-to-lint', files: ['**/*.{ts,mts,tsx,vue}'], }, _ignores, pluginVue.configs['flat/essential'], vueTsConfigs.recommended, { ...pluginVitest.configs.recommended, files: ['src/**/__tests__/*'], }, ...oxlint.configs['flat/recommended'], skipFormatting, // region >> eslint-plugin-unicorn >> eslintPluginUnicorn.configs.recommended, { rules: { 'unicorn/filename-case': 'off', 'unicorn/no-console-spaces': 'off', 'unicorn/no-null': 'off', 'unicorn/no-useless-spread': 'off', 'unicorn/prevent-abbreviations': 'off', 'unicorn/relative-url-style': 'off', // [plugin:vite:import-glob] Invalid glob: "imgs/*.png" (resolved: "imgs/*.png"). It must start with '/' or './' }, }, // endregion <<< eslint-plugin-unicorn <<< // region >>> eslint-plugin-import-x >>> eslintPluginImportX_flatConfigs.recommended, { rules: { 'import-x/no-unresolved': 'off', // https://github.com/pzmosquito/eslint-import-resolver-vite/blob/67da5e259ee4c9da4c44d81b93364ae2777d00eb/index.js#L100 'import-x/newline-after-import': 'error', 'import-x/first': 'error', 'import-x/no-named-as-default': 'off', 'import-x/no-duplicates': 'off', 'import-x/named': 'off', }, }, // endregion <<< eslint-plugin-import-x <<< // region >>> eslint-plugin-perfectionist >>> // https://perfectionist.dev/guide/getting-started perfectionist.configs['recommended-natural'], { rules: { 'perfectionist/sort-classes': 'off', 'perfectionist/sort-interfaces': 'off', 'perfectionist/sort-objects': 'off', 'perfectionist/sort-imports': ['error'], 'perfectionist/sort-modules': 'off', 'perfectionist/sort-object-types': 'off', 'perfectionist/sort-enums': 'off', 'perfectionist/sort-union-types': 'off', }, }, // endregion <<< eslint-plugin-perfectionist <<< { rules: { '@typescript-eslint/no-explicit-any': 'off', 'vue/block-order': [ 'error', { order: ['script', 'template', 'style'], }, ], 'vue/define-macros-order': [ 'error', { order: ['defineOptions', 'defineProps', 'defineEmits', 'defineSlots'], }, ], 'vue/multi-word-component-names': 'off', }, }, );