import antfu from '@antfu/eslint-config'; import { globalIgnores } from 'eslint/config'; import prettier from 'eslint-plugin-prettier/recommended'; import simpleImportSort from 'eslint-plugin-simple-import-sort'; import vueCss from 'eslint-plugin-vue-scoped-css'; import globals from 'globals'; import typescript from 'typescript-eslint'; export default antfu( { typescript: true, vue: true, jsonc: false, yaml: false, markdown: false, formatters: false, }, [ ...vueCss.configs['flat/recommended'], prettier, { languageOptions: { globals: { ...globals.browser, ...globals.node, ...globals.jest, defineProps: 'readonly', defineEmits: 'readonly', }, ecmaVersion: 6, sourceType: 'module', parserOptions: { parser: typescript.parser, allowImportExportEverywhere: true, ecmaFeatures: { jsx: true, }, }, }, plugins: { 'simple-import-sort': simpleImportSort, }, settings: { 'import/extensions': ['.js', '.jsx', '.ts', '.tsx'], }, rules: { /* Closed due to template running * (Recommended to open!) */ 'no-console': 'off', 'ts/no-explicit-any': 'off', /* Disallow person rules */ 'antfu/top-level-function': 'off', 'antfu/if-newline': 'off', 'n/prefer-global/process': 'off', /* If you need control the imports sequence, must be off * https://github.com/vuejs/vue-eslint-parser/issues/58 */ 'import/first': 'off', /* Allow start with _ */ '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', }, ], 'vue/no-unused-vars': [ 'error', { ignorePattern: '^_', }, ], // Using ts/no-unused-vars instead 'no-unused-vars': 'off', /* Some variables are initialized in the function */ '@typescript-eslint/no-use-before-define': 'off', 'no-use-before-define': 'off', /* Disable antfu sort, use simple sort import */ 'perfectionist/sort-imports': 'off', 'perfectionist/sort-named-imports': 'off', 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', // Disable unused-imports rules in other presets 'unused-imports/no-unused-imports': 'off', 'unused-imports/no-unused-vars': 'off', }, }, { files: ['**/*.vue'], rules: { 'vue/component-name-in-template-casing': ['error', 'kebab-case'], 'vue/custom-event-name-casing': ['error', 'kebab-case'], 'vue/block-order': [ 'error', { order: ['template', 'script', 'style'], }, ], 'vue/block-lang': [ 'error', { script: { lang: ['ts', 'tsx'], }, }, ], 'vue/multi-word-component-names': 'off', 'vue/no-reserved-props': 'off', 'vue/no-v-html': 'off', 'vue-scoped-css/no-parsing-error': 'off', 'vue-scoped-css/no-unused-selector': 'off', 'vue-scoped-css/enforce-style-type': [ 'error', { allows: ['scoped'], }, ], 'vue/padding-line-between-blocks': ['error', 'never'], }, }, globalIgnores([ '**/snapshot*', '**/dist', '**/lib', '**/es', '**/esm', '**/node_modules', 'src/_common', '**/static', '**/cypress', 'script/test/cypress', '**/_site', '**/temp*', '**/static/', '!**/.prettierrc.js', ]), ], );