122 lines
3.5 KiB
JavaScript
122 lines
3.5 KiB
JavaScript
|
|
import js from '@eslint/js';
|
||
|
|
import globals from 'globals';
|
||
|
|
import tseslint from 'typescript-eslint';
|
||
|
|
import pluginReact from 'eslint-plugin-react';
|
||
|
|
import reactHooks from 'eslint-plugin-react-hooks';
|
||
|
|
import regexp from 'eslint-plugin-regexp';
|
||
|
|
import pluginImport from 'eslint-plugin-import';
|
||
|
|
import fontawesome6 from '../eslint-plugins/fontawesome6/index.js';
|
||
|
|
import reanimated from '../eslint-plugins/reanimated/index.js';
|
||
|
|
import reactnative from '../eslint-plugins/react-native/index.js';
|
||
|
|
|
||
|
|
export default [
|
||
|
|
{
|
||
|
|
ignores: [
|
||
|
|
'**/dist/**',
|
||
|
|
'**/node_modules/**',
|
||
|
|
'api/**', // 排除自动生成的 API 代码
|
||
|
|
'src/api/**', // 排除 src 下的自动生成 API
|
||
|
|
'.expo/**', // 排除 Expo 自动生成的文件
|
||
|
|
'tailwind.config.js', // 排除 Tailwind 配置文件
|
||
|
|
'**/*.d.ts',
|
||
|
|
'eslint.config.*',
|
||
|
|
],
|
||
|
|
},
|
||
|
|
regexp.configs["flat/recommended"],
|
||
|
|
js.configs.recommended,
|
||
|
|
...tseslint.configs.recommended,
|
||
|
|
|
||
|
|
// React 的推荐配置
|
||
|
|
pluginReact.configs.flat.recommended,
|
||
|
|
pluginReact.configs.flat['jsx-runtime'],
|
||
|
|
reactHooks.configs.flat.recommended,
|
||
|
|
{
|
||
|
|
files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
|
||
|
|
|
||
|
|
// 语言选项:设置全局变量
|
||
|
|
languageOptions: {
|
||
|
|
globals: {
|
||
|
|
...globals.browser,
|
||
|
|
...globals.es2021,
|
||
|
|
'__DEV__': 'readonly',
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
// React 版本自动检测
|
||
|
|
settings: {
|
||
|
|
react: {
|
||
|
|
version: 'detect',
|
||
|
|
},
|
||
|
|
'import/resolver': {
|
||
|
|
typescript: {
|
||
|
|
project: ['./tsconfig.json'],
|
||
|
|
alwaysTryTypes: true,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
plugins: {
|
||
|
|
import: pluginImport,
|
||
|
|
fontawesome6,
|
||
|
|
reanimated,
|
||
|
|
reactnative,
|
||
|
|
},
|
||
|
|
rules: {
|
||
|
|
// 关闭代码风格规则
|
||
|
|
'semi': 'off',
|
||
|
|
'quotes': 'off',
|
||
|
|
'indent': 'off',
|
||
|
|
"no-empty": ["error", { "allowEmptyCatch": true }],
|
||
|
|
"no-unused-expressions": "warn",
|
||
|
|
"no-useless-escape": "warn",
|
||
|
|
'import/no-unresolved': 'error',
|
||
|
|
'@typescript-eslint/no-require-imports': 'off',
|
||
|
|
'@typescript-eslint/no-unused-vars': 'off',
|
||
|
|
'@typescript-eslint/no-explicit-any': 'off',
|
||
|
|
'@typescript-eslint/ban-ts-comment': 'off',
|
||
|
|
'@typescript-eslint/no-empty-object-type': 'off',
|
||
|
|
'no-prototype-builtins': 'off',
|
||
|
|
'react/react-in-jsx-scope': 'off',
|
||
|
|
'react/jsx-uses-react': 'off',
|
||
|
|
'fontawesome6/valid-name': 'error',
|
||
|
|
'reanimated/ban-mix-use': 'error',
|
||
|
|
// 禁止使用 via.placeholder.com 服务
|
||
|
|
'no-restricted-syntax': [
|
||
|
|
'error',
|
||
|
|
{
|
||
|
|
'selector': 'Literal[value=/via\\.placeholder\\.com/]',
|
||
|
|
'message': 'via.placeholder.com 服务不可用,禁止在代码中使用',
|
||
|
|
},
|
||
|
|
{
|
||
|
|
'selector': 'TemplateLiteral > TemplateElement[value.raw=/via\\.placeholder\\.com/]',
|
||
|
|
'message': 'via.placeholder.com 服务不可用,禁止在代码中使用',
|
||
|
|
},
|
||
|
|
],
|
||
|
|
'reactnative/wrap-horizontal-scrollview-inside-view': ['error'],
|
||
|
|
},
|
||
|
|
},
|
||
|
|
|
||
|
|
{
|
||
|
|
files: [
|
||
|
|
"metro.config.js",
|
||
|
|
"scripts/**/*.js",
|
||
|
|
"expo/scripts/**/*.js",
|
||
|
|
"eslint.config.js",
|
||
|
|
"babel.config.js",
|
||
|
|
"server/**/*.js"
|
||
|
|
],
|
||
|
|
languageOptions: {
|
||
|
|
globals: {
|
||
|
|
...globals.node,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
rules: {
|
||
|
|
// 在 .js 文件中关闭 TS 规则
|
||
|
|
'@typescript-eslint/no-require-imports': 'off',
|
||
|
|
// 在 Node.js 文件中允许 require
|
||
|
|
'@typescript-eslint/no-var-requires': 'off',
|
||
|
|
'no-undef': 'off',
|
||
|
|
},
|
||
|
|
},
|
||
|
|
];
|