pnpm create @eslint/config@latest
pnpm i -D eslint-config-prettier eslint-import-resolver-node eslint-plugin-file-progress eslint-plugin-import eslint-plugin-prettier eslint-plugin-tailwindcss eslint-plugin-vue eslint-import-resolver-alias prettier
"lint": "eslint . --fix",
"format": "prettier . --write"
import js from '@eslint/js'
import configPrettier from 'eslint-config-prettier'
import progress from 'eslint-plugin-file-progress'
import importPlugin from 'eslint-plugin-import'
import pluginPrettier from 'eslint-plugin-prettier'
import tailwind from 'eslint-plugin-tailwindcss'
import pluginVue from 'eslint-plugin-vue'
import globals from 'globals'
import autoImportGlobals from './.eslintrc-auto-import.json' with { type: 'json' }
export default [
progress.configs.recommended,
{
ignores: [
'node_modules/**',
'dist/**',
'build/**',
'vite/**',
'scripts/**',
'public/**',
'coverage/**',
'**/auto-imports.d.ts',
'**/components.d.ts',
'**/typings/*.d.ts',
'.vscode/**',
'.idea/**',
'vite.config.mjs',
'**/*.min.js',
'**/*.min.css',
'**/*.mjs',
'**/*.log',
'**/Xn*/**',
'**/tinymce/**',
'.eslintrc-auto-import.json',
'src/components/**',
],
},
js.configs.recommended,
{
files: ['**/*.{js,mjs,cjs,vue}'],
plugins: {
prettier: pluginPrettier,
import: importPlugin,
},
languageOptions: {
globals: {
...globals.browser,
...globals.node,
...autoImportGlobals.globals,
hiprint: 'readonly',
$: 'readonly',
AMap: 'readonly',
AMapUI: 'readonly',
BMapGL: 'readonly',
tinymce: 'readonly',
arguments: 'readonly',
ZwLog: 'readonly',
T: 'readonly',
},
ecmaVersion: 'latest',
sourceType: 'module',
},
settings: {
'import/resolver': {
node: {
extensions: ['.js', '.jsx', '.mjs', '.cjs', '.vue'],
moduleDirectory: ['node_modules', 'src'],
resolvePaths: ['.'],
tryExtensions: ['.js', '.jsx', '.mjs', '.cjs', '.vue', '.json'],
},
},
'import/core-modules': [],
'import/ignore': ['node_modules', '\\.(coffee|scss|css|less|hbs|svg|json)$'],
'import/external-module-folders': ['node_modules'],
},
rules: {
'prettier/prettier': 'error',
'no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
ignoreRestSiblings: true,
varsIgnorePattern: '^_',
caughtErrors: 'all',
destructuredArrayIgnorePattern: '^_',
},
],
'no-console': ['warn', { allow: ['warn', 'error'] }],
'no-debugger': 'warn',
'no-alert': 'warn',
'no-var': 'error',
'prefer-const': 'error',
'no-eval': 'warn',
'no-new-func': 'warn',
'no-return-await': 'warn',
'require-await': 'warn',
'prefer-arrow-callback': 'warn',
'no-unreachable': 'error',
'no-unused-expressions': ['error', { allowShortCircuit: true, allowTernary: true }],
'padding-line-between-statements': ['error', { blankLine: 'always', prev: 'function', next: 'function' }],
'no-duplicate-imports': 'off',
'array-callback-return': 'error',
'object-shorthand': ['warn', 'always'],
curly: ['error', 'all'],
eqeqeq: ['error', 'smart'],
'no-implied-eval': 'error',
'import/no-duplicates': ['error', { 'prefer-inline': false }],
'import/order': [
'error',
{
groups: [
'builtin',
'external',
'internal',
'parent',
'sibling',
'index',
],
'newlines-between': 'never',
alphabetize: {
order: 'asc',
caseInsensitive: true,
},
warnOnUnassignedImports: true,
},
],
'import/no-unresolved': [
'error',
{
caseSensitive: true,
commonjs: true,
ignore: ['^@/', '^~/'],
},
],
'import/no-cycle': ['warn', { maxDepth: 3 }],
'import/no-self-import': 'error',
'import/no-absolute-path': 'error',
'import/no-useless-path-segments': [
'error',
{
noUselessIndex: true,
commonjs: true,
},
],
'import/no-unused-modules': 'off',
'import/no-deprecated': 'warn',
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: [
'**/*.test.{js,jsx,ts,tsx}',
'**/*.spec.{js,jsx,ts,tsx}',
'**/vite.config.*',
'**/vitest.config.*',
'**/eslint.config.*',
'**/prettier.config.*',
'**/tailwind.config.*',
'**/postcss.config.*',
],
optionalDependencies: false,
peerDependencies: false,
},
],
'import/no-mutable-exports': 'error',
'import/no-named-as-default': 'warn',
'import/no-named-as-default-member': 'warn',
'import/no-named-default': 'error',
'import/no-default-export': 'off',
'import/prefer-default-export': 'off',
'import/exports-last': 'off',
'import/group-exports': 'off',
'import/dynamic-import-chunkname': 'off',
'import/no-import-module-exports': 'error',
'import/no-relative-packages': 'warn',
'import/no-relative-parent-imports': 'off',
'import/no-restricted-paths': 'off',
'import/no-internal-modules': 'off',
'import/no-unassigned-import': 'off',
'import/no-amd': 'error',
'import/no-commonjs': 'off',
'import/no-nodejs-modules': 'off',
'import/first': 'error',
'import/newline-after-import': ['error', { count: 1 }],
'import/no-namespace': 'off',
},
},
...pluginVue.configs['flat/strongly-recommended'],
{
files: ['**/*.vue'],
rules: {
'vue/multi-word-component-names': 'off',
'vue/require-prop-types': 'off',
'vue/block-order': [
'error',
{
order: ['template', 'script', 'style'],
},
],
'vue/component-name-in-template-casing': ['error', 'PascalCase'],
'vue/no-v-html': 'warn',
'vue/require-default-prop': 'off',
'vue/require-explicit-emits': 'error',
'vue/no-multiple-slot-args': 'error',
'vue/define-macros-order': [
'warn',
{
order: ['defineOptions', 'defineModel', 'defineProps', 'defineEmits', 'defineSlots'],
},
],
'vue/prefer-define-options': 'warn',
'vue/attributes-order': [
'error',
{
order: [
'DEFINITION',
'LIST_RENDERING',
'CONDITIONALS',
'RENDER_MODIFIERS',
'GLOBAL',
'UNIQUE',
'TWO_WAY_BINDING',
'OTHER_DIRECTIVES',
'OTHER_ATTR',
'EVENTS',
'CONTENT',
],
alphabetical: false,
},
],
},
},
...tailwind.configs['flat/recommended'],
{
files: ['**/*.{vue,js,jsx}'],
rules: {
'tailwindcss/no-custom-classname': 'off',
'tailwindcss/classnames-order': 'warn',
},
},
configPrettier,
]