import js from '@eslint/js' import { defineConfig } from 'eslint/config' import configPrettier from 'eslint-config-prettier' import jsonc from 'eslint-plugin-jsonc' import pluginPrettier from 'eslint-plugin-prettier/recommended' import simpleImportSort from 'eslint-plugin-simple-import-sort' import pluginUnicorn from 'eslint-plugin-unicorn' import pluginVue from 'eslint-plugin-vue' import globals from 'globals' import * as jsoncParser from 'jsonc-eslint-parser' import tseslint from 'typescript-eslint' import vueParser from 'vue-eslint-parser' export default defineConfig( { ignores: ['**/node_modules/**', '**/out/**', '**/webpack.config.js', 'vitest.workspace.mjs', '**/dist/**'], }, js.configs.recommended, ...pluginVue.configs['flat/recommended'], ...tseslint.configs.recommended, ...tseslint.configs.stylistic, { files: ['**/*.ts', '**/*.d.ts'], languageOptions: { parser: tseslint.parser, sourceType: 'module', ecmaVersion: 'latest', globals: { ...globals.browser, ...globals.node, }, }, }, { files: ['**/*.vue'], languageOptions: { parser: vueParser, parserOptions: { parser: tseslint.parser, extraFileExtensions: ['.vue'], sourceType: 'module', ecmaVersion: 'latest', }, globals: { ...globals.browser, ...globals.node, }, }, }, { files: ['**/*.ts', '**/*.d.ts', '**/*.vue', 'eslint.config.js', 'vite.config.js', 'electron.vite.config.js'], plugins: { 'simple-import-sort': simpleImportSort, unicorn: pluginUnicorn, }, rules: { 'unicorn/prefer-node-protocol': 'error', 'unicorn/prefer-module': 'error', 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', eqeqeq: 'error', 'no-caller': 'error', 'no-constant-condition': ['error', { checkLoops: false }], 'no-eval': 'error', 'no-extra-bind': 'error', 'no-new-func': 'error', 'no-new-wrappers': 'error', 'no-throw-literal': 'error', 'no-undef-init': 'error', 'no-var': 'error', 'object-shorthand': 'error', 'prefer-const': 'error', 'prefer-object-spread': 'error', 'unicode-bom': ['error', 'never'], 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-unused-vars': 'off', 'no-extra-boolean-cast': 'off', 'no-case-declarations': 'off', 'no-cond-assign': 'off', 'no-control-regex': 'off', 'no-inner-declarations': 'off', 'no-empty': 'off', // @typescript-eslint/eslint-plugin '@typescript-eslint/no-unused-expressions': 'off', '@typescript-eslint/ban-ts-comment': 'off', '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-namespace': 'off', '@typescript-eslint/no-non-null-asserted-optional-chain': 'off', '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/no-empty-interface': 'off', '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-empty-object-type': 'off', // {} is a totally useful and valid type. '@typescript-eslint/no-require-imports': 'off', '@typescript-eslint/no-inferrable-types': 'off', '@typescript-eslint/no-this-alias': 'off', // Pending https://github.com/typescript-eslint/typescript-eslint/issues/4820 '@typescript-eslint/prefer-optional-chain': 'off', '@typescript-eslint/no-unused-vars': [ 'error', { args: 'all', argsIgnorePattern: '^_', caughtErrors: 'all', caughtErrorsIgnorePattern: '^_', }, ], 'vue/no-v-html': 'off', 'vue/multi-word-component-names': 'off', 'no-undef': 'off', // TypeScript handles this 'no-async-promise-executor': 'off', }, }, ...jsonc.configs['flat/recommended-with-jsonc'], { files: ['**/*.json', '**/*.jsonc', '**/*.json5'], languageOptions: { parser: jsoncParser, }, rules: { 'jsonc/array-bracket-spacing': ['error', 'never'], 'jsonc/comma-dangle': ['error', 'never'], 'jsonc/indent': ['error', 2], 'jsonc/no-comments': 'off', 'jsonc/quotes': ['error', 'double'], }, }, { files: ['src/renderer/i18n/**/*.json', 'src/main/i18n/locales/**/*.json'], rules: { 'jsonc/sort-keys': [ 'error', 'asc', // 升序排列 { caseSensitive: false, natural: true, }, ], }, }, { files: ['**/*.mjs', '**/*.mts'], rules: { // These globals don't exist outside of CJS files. 'no-restricted-globals': [ 'error', { name: '__filename' }, { name: '__dirname' }, { name: 'require' }, { name: 'module' }, { name: 'exports' }, ], }, }, { files: ['*.config.js', '.stylelintrc.cjs', 'scripts/*.{js,mjs,cjs}', 'tests/*.{js,mjs,cjs}'], languageOptions: { globals: { ...globals.node, }, }, rules: { // 在脚本文件中,通常允许使用 console 和 require 'no-console': 'off', '@typescript-eslint/no-require-imports': 'off', '@typescript-eslint/no-var-requires': 'off', }, }, configPrettier, pluginPrettier, )