@fast-china/eslint-config 1.0.48 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +175 -66
- package/README.zh.md +175 -66
- package/dist/{typegen.d.ts → define-rules-CSwQ8C1q.d.ts} +5577 -2499
- package/dist/index.d.ts +110 -5
- package/dist/index.js +380 -571
- package/dist/index.js.map +1 -1
- package/dist/rules/index.d.ts +204 -22
- package/dist/rules/index.js +123 -233
- package/dist/rules/index.js.map +1 -1
- package/docs/engineering-audit.zh.md +105 -0
- package/docs/rules-risk.md +110 -0
- package/docs/rules-risk.zh.md +114 -0
- package/package.json +60 -46
package/dist/rules/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/rules/common.ts","../../src/rules/import.ts","../../src/rules/javascript.ts","../../src/rules/sort-package.ts","../../src/rules/sort-tsconfig.ts","../../src/rules/typescript.ts","../../src/rules/vue.ts"],"sourcesContent":["import type { Linter } from \"eslint\";\n\n/**\n * 公共规则\n * @description 最佳实践\n */\nexport const commonRules: Linter.RulesRecord = {\n\t// 确保数组的回调函数(如 Array.prototype.map、Array.prototype.filter、Array.prototype.reduce 等)总是有一个返回值\n\t\"array-callback-return\": \"error\",\n\t// 强制使用块级作用域变量(let 或 const),避免使用函数作用域变量(var)\n\t\"block-scoped-var\": \"error\",\n\t// 禁止使用 alert、confirm 和 prompt 等浏览器弹出对话框\n\t\"no-alert\": \"warn\",\n\t// 禁止在 switch 语句的 case 或 default 子句中声明变量\n\t\"no-case-declarations\": \"error\",\n\t// 禁止使用多行字符串,即不允许使用反斜杠 \\ 来连接多行字符串\n\t\"no-multi-str\": \"error\",\n\t// 禁止使用 with 语句\n\t\"no-with\": \"error\",\n\t// 禁止使用 void 操作符\n\t\"no-void\": \"error\",\n\t// 禁止多个空行\n\t\"@stylistic/no-multiple-empty-lines\": [\n\t\t\"error\",\n\t\t{\n\t\t\t// 最多允许1行\n\t\t\tmax: 1,\n\t\t},\n\t],\n\n\t// import 排序\n\t\"sort-imports\": [\n\t\t\"warn\",\n\t\t{\n\t\t\t// 不忽略导入语句中模块名的大小写\n\t\t\tignoreCase: false,\n\t\t\t// 忽略导入声明的排序\n\t\t\tignoreDeclarationSort: true,\n\t\t\t// 不忽略导入成员的排序\n\t\t\tignoreMemberSort: false,\n\t\t\t// 成员语法排序顺序\n\t\t\tmemberSyntaxSortOrder: [\"none\", \"all\", \"multiple\", \"single\"],\n\t\t\t// 不允许分组导入\n\t\t\tallowSeparatedGroups: false,\n\t\t},\n\t],\n\n\t// 强制在数学运算中使用 ** 运算符代替 Math.pow()\n\t\"prefer-exponentiation-operator\": \"error\",\n};\n","import type { Linter } from \"eslint\";\n\n/**\n * 导入使用 lodash-unified 模块规则\n */\nexport const importUseLodashUnifiedRules: Linter.RulesRecord = {\n\t// 限制某些模块导入\n\t\"no-restricted-imports\": [\n\t\t\"error\",\n\t\t{\n\t\t\tpaths: [\n\t\t\t\t{ name: \"lodash\", message: \"Use lodash-unified instead.\" },\n\t\t\t\t{ name: \"lodash-es\", message: \"Use lodash-unified instead.\" },\n\t\t\t],\n\t\t\tpatterns: [\n\t\t\t\t{\n\t\t\t\t\tgroup: [\"lodash/*\", \"lodash-es/*\"],\n\t\t\t\t\tmessage: \"Use lodash-unified instead.\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n};\n\n/**\n * 导入使用 lodash 模块规则\n */\nexport const importUseLodashRules: Linter.RulesRecord = {\n\t// 限制某些模块导入\n\t\"no-restricted-imports\": [\n\t\t\"error\",\n\t\t{\n\t\t\tpaths: [\n\t\t\t\t{ name: \"lodash-es\", message: \"Use lodash instead.\" },\n\t\t\t\t{ name: \"lodash-unified\", message: \"Use lodash instead.\" },\n\t\t\t],\n\t\t\tpatterns: [\n\t\t\t\t{\n\t\t\t\t\tgroup: [\"lodash-es/*\", \"lodash-unified/*\"],\n\t\t\t\t\tmessage: \"Use lodash instead.\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n};\n\n/**\n * import规则\n */\nexport const importRules: Linter.RulesRecord = {\n\t// 确保所有的 import 语句位于文件的顶部,紧接在文件的开头部分,且在任何其他代码之前\n\t\"import-x/first\": \"error\",\n\t// 禁止在同一文件中出现重复的 import 语句\n\t\"import-x/no-duplicates\": \"error\",\n\t// 导入模块排序风格\n\t\"import-x/order\": [\n\t\t\"error\",\n\t\t{\n\t\t\t// 导入模块分组\n\t\t\tgroups: [\n\t\t\t\t// Node.js 内置模块\n\t\t\t\t\"builtin\",\n\t\t\t\t// 第三方模块\n\t\t\t\t\"external\",\n\t\t\t\t// 项目内部模块\n\t\t\t\t\"internal\",\n\t\t\t\t// 父级目录中的模块\n\t\t\t\t\"parent\",\n\t\t\t\t// 具有相同父级的模块\n\t\t\t\t\"sibling\",\n\t\t\t\t// 当前目录的 index.js 或 index.ts 文件\n\t\t\t\t\"index\",\n\t\t\t\t\"object\",\n\t\t\t\t\"type\",\n\t\t\t\t\"unknown\",\n\t\t\t],\n\t\t\tpathGroups: [\n\t\t\t\t{\n\t\t\t\t\tpattern: \"@dcloudio/*\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: \"vue\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: \"@vue/**\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: \"element-plus\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: \"@element-plus/**\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: \"fast-element-plus\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: \"@fast-element-plus/**\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: \"@fast-china/**\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: \"lodash\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: \"lodash-es\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpattern: \"lodash-unified\",\n\t\t\t\t\tgroup: \"external\",\n\t\t\t\t\tposition: \"before\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tpathGroupsExcludedImportTypes: [\"type\"],\n\t\t\t// 禁止不同组之间进行换行\n\t\t\t\"newlines-between\": \"never\",\n\t\t\t// 根据字母顺序对每个组内的顺序进行排序\n\t\t\talphabetize: {\n\t\t\t\torder: \"asc\",\n\t\t\t\tcaseInsensitive: true,\n\t\t\t},\n\t\t},\n\t],\n\t// 关闭 - 禁用对无法解析的模块导入的检查\n\t\"import-x/no-unresolved\": \"off\",\n\t// 关闭 - 禁用对命名空间导入(例如,import * as)的检查\n\t\"import-x/namespace\": \"off\",\n\t// 关闭 - 禁用对默认导入的检查\n\t\"import-x/default\": \"off\",\n\t// 关闭 - 禁用对以默认导出方式作为命名导入的检查\n\t\"import-x/no-named-as-default\": \"off\",\n\t// 关闭 - 禁用对将默认导出成员当作命名导入的检查\n\t\"import-x/no-named-as-default-member\": \"off\",\n\t// 关闭 - 禁用对命名导入(即从模块中导入特定命名的内容)的检查\n\t\"import-x/named\": \"off\",\n};\n","import type { Linter } from \"eslint\";\n\n/**\n * JavaScript规则\n */\nexport const javascriptRules: Linter.RulesRecord = {\n\t// JS/TS (http://eslint.cn/docs/rules)\n\n\t// 强制使用 camelCase 命名风格\n\tcamelcase: [\n\t\t\"error\",\n\t\t{\n\t\t\t// 允许对象属性使用非 camelCase 风格\n\t\t\tproperties: \"never\",\n\t\t},\n\t],\n\t// 禁止使用控制台\n\t\"no-console\": [\n\t\t\"warn\",\n\t\t{\n\t\t\t// 允许除 warn/error 之外的其他 console.xx 方法\n\t\t\tallow: [\"warn\", \"error\"],\n\t\t},\n\t],\n\t// 禁止使用 debugger\n\t\"no-debugger\": \"warn\",\n\t// 禁止在条件语句中使用常量条件\n\t\"no-constant-condition\": [\n\t\t\"error\",\n\t\t{\n\t\t\t// 允许在循环语句中使用常量条件\n\t\t\tcheckLoops: false,\n\t\t},\n\t],\n\t// 禁止使用某些特定的语法\n\t\"no-restricted-syntax\": [\n\t\t\"error\",\n\t\t// 禁止使用标记语句(labeled statements)\n\t\t\"LabeledStatement\",\n\t\t// 禁止使用 with 语句\n\t\t\"WithStatement\",\n\t],\n\t// 禁止在 return 语句中使用 await\n\t\"@typescript-eslint/return-await\": \"error\",\n\t// 禁止使用 var 关键字,强制使用 let 或 const\n\t\"no-var\": \"error\",\n\t// 禁止使用空的块语句\n\t\"no-empty\": [\n\t\t\"error\",\n\t\t{\n\t\t\t// 允许空的 catch 块\n\t\t\tallowEmptyCatch: true,\n\t\t},\n\t],\n\t// 该规则禁止使用不规则或不标准的空白字符\n\t\"no-irregular-whitespace\": \"error\",\n\t// 禁止在函数或变量定义之前使用它们\n\t\"no-use-before-define\": \"warn\",\n\t// 强制使用 const 声明不被修改的变量\n\t\"prefer-const\": [\n\t\t\"warn\",\n\t\t{\n\t\t\t// 在解构赋值时也推荐使用 const\n\t\t\tdestructuring: \"all\",\n\t\t\t// 允许在变量首次赋值前读取变量的值\n\t\t\tignoreReadBeforeAssign: true,\n\t\t},\n\t],\n\t// 强制使用箭头函数而非普通函数\n\t\"prefer-arrow-callback\": [\n\t\t\"error\",\n\t\t{\n\t\t\t// 不允许使用命名函数作为回调函数\n\t\t\tallowNamedFunctions: false,\n\t\t\t// 允许在箭头函数中使用 this 绑定的上下文\n\t\t\tallowUnboundThis: true,\n\t\t},\n\t],\n\t// 强制使用对象字面量的方法和属性简写语法\n\t\"object-shorthand\": [\n\t\t\"error\",\n\t\t\"always\",\n\t\t{\n\t\t\t// 不忽略构造函数中的属性简写\n\t\t\tignoreConstructors: false,\n\t\t\t// 强制避免在属性名中使用引号\n\t\t\tavoidQuotes: true,\n\t\t},\n\t],\n\t// 强制使用 rest 参数代替 arguments 对象\n\t\"prefer-rest-params\": \"error\",\n\t// 强制使用展开运算符(...)代替 Function.prototype.apply\n\t\"prefer-spread\": \"error\",\n\t// 强制使用模板字面量代替字符串连接\n\t\"prefer-template\": \"error\",\n\t// 禁止在同一作用域中重新声明变量\n\t\"no-redeclare\": \"error\",\n};\n","import type { Linter } from \"eslint\";\n\n/**\n * package.json 属性排序规则\n */\nexport const packageJsonSortRules: Linter.RulesRecord = {\n\t\"jsonc/sort-array-values\": [\n\t\t\"error\",\n\t\t{\n\t\t\torder: { type: \"asc\" },\n\t\t\tpathPattern: \"^files$\",\n\t\t},\n\t],\n\t\"jsonc/sort-keys\": [\n\t\t\"error\",\n\t\t{\n\t\t\torder: [\n\t\t\t\t\"name\",\n\t\t\t\t\"version\",\n\t\t\t\t\"private\",\n\t\t\t\t\"packageManager\",\n\t\t\t\t\"description\",\n\t\t\t\t\"type\",\n\t\t\t\t\"keywords\",\n\t\t\t\t\"license\",\n\t\t\t\t\"homepage\",\n\t\t\t\t\"bugs\",\n\t\t\t\t\"repository\",\n\t\t\t\t\"author\",\n\t\t\t\t\"contributors\",\n\t\t\t\t\"funding\",\n\t\t\t\t\"files\",\n\t\t\t\t\"main\",\n\t\t\t\t\"module\",\n\t\t\t\t\"types\",\n\t\t\t\t\"exports\",\n\t\t\t\t\"typesVersions\",\n\t\t\t\t\"sideEffects\",\n\t\t\t\t\"unpkg\",\n\t\t\t\t\"jsdelivr\",\n\t\t\t\t\"browser\",\n\t\t\t\t\"bin\",\n\t\t\t\t\"man\",\n\t\t\t\t\"directories\",\n\t\t\t\t\"publishConfig\",\n\t\t\t\t\"scripts\",\n\t\t\t\t\"peerDependencies\",\n\t\t\t\t\"peerDependenciesMeta\",\n\t\t\t\t\"optionalDependencies\",\n\t\t\t\t\"dependencies\",\n\t\t\t\t\"devDependencies\",\n\t\t\t\t\"engines\",\n\t\t\t\t\"config\",\n\t\t\t\t\"overrides\",\n\t\t\t\t\"pnpm\",\n\t\t\t\t\"husky\",\n\t\t\t\t\"lint-staged\",\n\t\t\t\t\"eslintConfig\",\n\t\t\t\t\"prettier\",\n\t\t\t],\n\t\t\tpathPattern: \"^$\",\n\t\t},\n\t\t{\n\t\t\torder: { type: \"asc\" },\n\t\t\tpathPattern: \"^(?:dev|peer|optional|bundled)?[Dd]ependencies(Meta)?$\",\n\t\t},\n\t\t{\n\t\t\torder: [\"types\", \"require\", \"import\", \"default\"],\n\t\t\tpathPattern: \"^exports.*$\",\n\t\t},\n\t\t{\n\t\t\torder: { type: \"asc\" },\n\t\t\tpathPattern: \"^(?:resolutions|overrides|pnpm.overrides)$\",\n\t\t},\n\t],\n};\n","import type { Linter } from \"eslint\";\n\n/**\n * tsconfig.json 属性排序规则\n */\nexport const tsconfigJsonSortRules: Linter.RulesRecord = {\n\t// 允许注释\n\t\"jsonc/no-comments\": \"off\",\n\n\t\"jsonc/sort-keys\": [\n\t\t\"error\",\n\t\t{\n\t\t\torder: [\"extends\", \"compilerOptions\", \"references\", \"files\", \"include\", \"exclude\"],\n\t\t\tpathPattern: \"^$\",\n\t\t},\n\t\t{\n\t\t\torder: [\n\t\t\t\t/* Projects */\n\t\t\t\t\"incremental\",\n\t\t\t\t\"composite\",\n\t\t\t\t\"tsBuildInfoFile\",\n\t\t\t\t\"disableSourceOfProjectReferenceRedirect\",\n\t\t\t\t\"disableSolutionSearching\",\n\t\t\t\t\"disableReferencedProjectLoad\",\n\t\t\t\t/* Language and Environment */\n\t\t\t\t\"target\",\n\t\t\t\t\"jsx\",\n\t\t\t\t\"jsxFactory\",\n\t\t\t\t\"jsxFragmentFactory\",\n\t\t\t\t\"jsxImportSource\",\n\t\t\t\t\"lib\",\n\t\t\t\t\"moduleDetection\",\n\t\t\t\t\"noLib\",\n\t\t\t\t\"reactNamespace\",\n\t\t\t\t\"useDefineForClassFields\",\n\t\t\t\t\"emitDecoratorMetadata\",\n\t\t\t\t\"experimentalDecorators\",\n\t\t\t\t/* Modules */\n\t\t\t\t\"baseUrl\",\n\t\t\t\t\"rootDir\",\n\t\t\t\t\"rootDirs\",\n\t\t\t\t\"customConditions\",\n\t\t\t\t\"module\",\n\t\t\t\t\"moduleResolution\",\n\t\t\t\t\"moduleSuffixes\",\n\t\t\t\t\"noResolve\",\n\t\t\t\t\"paths\",\n\t\t\t\t\"resolveJsonModule\",\n\t\t\t\t\"resolvePackageJsonExports\",\n\t\t\t\t\"resolvePackageJsonImports\",\n\t\t\t\t\"typeRoots\",\n\t\t\t\t\"types\",\n\t\t\t\t\"allowArbitraryExtensions\",\n\t\t\t\t\"allowImportingTsExtensions\",\n\t\t\t\t\"allowUmdGlobalAccess\",\n\t\t\t\t/* JavaScript Support */\n\t\t\t\t\"allowJs\",\n\t\t\t\t\"checkJs\",\n\t\t\t\t\"maxNodeModuleJsDepth\",\n\t\t\t\t/* Type Checking */\n\t\t\t\t\"strict\",\n\t\t\t\t\"strictBindCallApply\",\n\t\t\t\t\"strictFunctionTypes\",\n\t\t\t\t\"strictNullChecks\",\n\t\t\t\t\"strictPropertyInitialization\",\n\t\t\t\t\"allowUnreachableCode\",\n\t\t\t\t\"allowUnusedLabels\",\n\t\t\t\t\"alwaysStrict\",\n\t\t\t\t\"exactOptionalPropertyTypes\",\n\t\t\t\t\"noFallthroughCasesInSwitch\",\n\t\t\t\t\"noImplicitAny\",\n\t\t\t\t\"noImplicitOverride\",\n\t\t\t\t\"noImplicitReturns\",\n\t\t\t\t\"noImplicitThis\",\n\t\t\t\t\"noPropertyAccessFromIndexSignature\",\n\t\t\t\t\"noUncheckedIndexedAccess\",\n\t\t\t\t\"noUnusedLocals\",\n\t\t\t\t\"noUnusedParameters\",\n\t\t\t\t\"useUnknownInCatchVariables\",\n\t\t\t\t/* Emit */\n\t\t\t\t\"declaration\",\n\t\t\t\t\"declarationDir\",\n\t\t\t\t\"declarationMap\",\n\t\t\t\t\"downlevelIteration\",\n\t\t\t\t\"emitBOM\",\n\t\t\t\t\"emitDeclarationOnly\",\n\t\t\t\t\"importHelpers\",\n\t\t\t\t\"importsNotUsedAsValues\",\n\t\t\t\t\"inlineSourceMap\",\n\t\t\t\t\"inlineSources\",\n\t\t\t\t\"isolatedDeclarations\",\n\t\t\t\t\"mapRoot\",\n\t\t\t\t\"newLine\",\n\t\t\t\t\"noEmit\",\n\t\t\t\t\"noEmitHelpers\",\n\t\t\t\t\"noEmitOnError\",\n\t\t\t\t\"outDir\",\n\t\t\t\t\"outFile\",\n\t\t\t\t\"preserveConstEnums\",\n\t\t\t\t\"preserveValueImports\",\n\t\t\t\t\"removeComments\",\n\t\t\t\t\"sourceMap\",\n\t\t\t\t\"sourceRoot\",\n\t\t\t\t\"stripInternal\",\n\t\t\t\t/* Interop Constraints */\n\t\t\t\t\"allowSyntheticDefaultImports\",\n\t\t\t\t\"esModuleInterop\",\n\t\t\t\t\"forceConsistentCasingInFileNames\",\n\t\t\t\t\"isolatedModules\",\n\t\t\t\t\"preserveSymlinks\",\n\t\t\t\t\"verbatimModuleSyntax\",\n\t\t\t\t/* Completeness */\n\t\t\t\t\"skipDefaultLibCheck\",\n\t\t\t\t\"skipLibCheck\",\n\t\t\t],\n\t\t\tpathPattern: \"^compilerOptions$\",\n\t\t},\n\t],\n};\n","import type { Linter } from \"eslint\";\n\n/**\n * TypeScript规则\n */\nexport const typescriptRules: Linter.RulesRecord = {\n\t// TS (https://typescript-eslint.io/rules)\n\n\t// 要求在导出函数和类的公共方法上显式声明返回类型\n\t\"@typescript-eslint/explicit-module-boundary-types\": [\n\t\t\"error\",\n\t\t{\n\t\t\tallowArgumentsExplicitlyTypedAsAny: true,\n\t\t},\n\t],\n\t// 要求在 TypeScript 函数和方法中显式地指定返回类型\n\t\"@typescript-eslint/explicit-function-return-type\": \"error\",\n\t// 禁止在同一作用域中重新声明 TypeScript 变量\n\t\"@typescript-eslint/no-redeclare\": \"error\",\n\t// 禁止定义未使用的变量,方法参数排除。\n\t\"@typescript-eslint/no-unused-vars\": [\"error\", { args: \"none\" }],\n\t// 允许使用自定义TypeScript模块和命名空间\n\t\"@typescript-eslint/no-namespace\": \"off\",\n\t// 允许使用 any 类型\n\t\"@typescript-eslint/no-explicit-any\": \"off\",\n\t// 禁止在 TypeScript 文件中使用 require 函数进行模块导入\n\t\"@typescript-eslint/no-require-imports\": \"error\",\n\t// 禁止定义空函数\n\t\"@typescript-eslint/no-empty-function\": [\"error\", { allow: [] }],\n\t// 禁止无用的表达式\n\t\"@typescript-eslint/no-unused-expressions\": [\n\t\t\"error\",\n\t\t{\n\t\t\t// 允许短路操作符(&& 和 ||)中的无副作用表达式\n\t\t\tallowShortCircuit: true,\n\t\t\t// 允许三元操作符中的无副作用表达式\n\t\t\tallowTernary: true,\n\t\t},\n\t],\n\t// 禁止在 TypeScript 代码中对类型已经可以被推断的变量或参数进行显式的类型注解\n\t\"@typescript-eslint/no-inferrable-types\": \"error\",\n\t// 禁止使用后缀运算符的非空断言(!)\n\t\"@typescript-eslint/no-non-null-assertion\": \"error\",\n\t// 禁止在可选链(?)后使用非空断言(!)\n\t\"@typescript-eslint/no-non-null-asserted-optional-chain\": \"error\",\n\t// 禁止在代码中使用 @ts-ignore 注释\n\t\"@typescript-eslint/ban-ts-comment\": [\"error\", { \"ts-ignore\": false }],\n\t// 一致地使用 TypeScript 类型导入\n\t\"@typescript-eslint/consistent-type-imports\": [\n\t\t\"error\",\n\t\t{\n\t\t\t// 允许使用类型注解\n\t\t\tdisallowTypeAnnotations: false,\n\t\t},\n\t],\n};\n","import type { Linter } from \"eslint\";\n\n/**\n * Vue规则\n */\nexport const vueRules: Linter.RulesRecord = {\n\t// vue (https://eslint.vuejs.org/rules)\n\n\t// 允许使用 v-html\n\t\"vue/no-v-html\": \"off\",\n\t// 禁用所有 props 必填时,必须提供默认值\n\t\"vue/require-default-prop\": \"off\",\n\t// 强制组件中必须使用 emits 选项声明事件\n\t\"vue/require-explicit-emits\": \"error\",\n\t// 禁用组件名称必须是多单词\n\t\"vue/multi-word-component-names\": \"off\",\n\t// 关闭 - 强制从 vue 中导入 Vue相关 API\n\t\"vue/prefer-import-from-vue\": \"off\",\n\t// 强制 HTML 属性使用 camelCase 风格\n\t\"vue/attribute-hyphenation\": [\n\t\t\"error\",\n\t\t\"never\",\n\t\t{\n\t\t\tignore: [\n\t\t\t\t// 忽略 Element-Plus 加载文案\"element-loading-text\"\n\t\t\t\t\"element-loading-text\",\n\n\t\t\t\t// 忽略 UniApp view 标签的一些属性\n\t\t\t\t\"hover-class\",\n\t\t\t\t\"hover-stop-propagation\",\n\t\t\t\t\"hover-start-time\",\n\t\t\t\t\"hover-stay-time\",\n\t\t\t],\n\t\t},\n\t],\n\n\t// 禁止重复的字段名\n\t\"vue/no-dupe-keys\": \"error\",\n\t// 禁止直接修改 props 的值\n\t\"vue/no-mutating-props\": \"error\",\n\t// 禁止使用 Vue.js 内置的保留组件名称(如 transition、keep-alive 等)作为自定义组件名称\n\t\"vue/no-reserved-component-names\": \"error\",\n\t// 禁止在自定义组件上使用 v-text 或 v-html 指令\n\t\"vue/no-v-text-v-html-on-component\": \"off\",\n\t// 防止<script setup>使用的变量<template>被标记为未使用,此规则仅在启用该no-unused-vars规则时有效。\n\t// \"vue/script-setup-uses-vars\": \"error\",\n\t// 强制自定义事件名称使用 camelCase 风格命名\n\t\"vue/custom-event-name-casing\": [\"error\", \"camelCase\"],\n\t// 强制每个 Vue 文件中只包含一个 Vue 组件\n\t\"vue/one-component-per-file\": \"off\",\n\t// 闭合标签换行风格\n\t\"vue/html-closing-bracket-newline\": [\n\t\t\"error\",\n\t\t{\n\t\t\t// 强制要求当 HTML 元素跨多行时,闭合标签必须出现在新的一行上\n\t\t\tmultiline: \"always\",\n\t\t\t// 强制要求当 HTML 元素只有一行时,闭合标签应与开始标签在同一行上\n\t\t\tsingleline: \"never\",\n\t\t},\n\t],\n\t// 强制 Vue 模板中 HTML 元素的属性按照指定的顺序排列\n\t\"vue/attributes-order\": [\n\t\t\"error\",\n\t\t{\n\t\t\torder: [\"DEFINITION\", \"LIST_RENDERING\", \"CONDITIONALS\", \"RENDER_MODIFIERS\", \"GLOBAL\", \"UNIQUE\", \"OTHER_ATTR\", \"EVENTS\", \"CONTENT\"],\n\t\t},\n\t],\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/define-rules.ts","../../src/rules/common.ts","../../src/rules/import.ts","../../src/rules/javascript.ts","../../src/rules/sort-package.ts","../../src/rules/sort-tsconfig.ts","../../src/rules/typescript.ts","../../src/rules/vue.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { RuleOptions } from \"./typegen\";\nimport type { Linter } from \"eslint\";\n\ntype RejectUnknownRuleNames<Rules extends RuleOptions> = Rules & Record<Exclude<keyof Rules, keyof RuleOptions>, never>;\n\n/**\n * 为项目规则提供精确的规则名、严重级别和规则选项自动补全。\n *\n * 该函数不会修改传入对象;它只在 TypeScript 编译阶段拒绝未知规则和无效选项。\n */\nexport const defineRules = <const Rules extends RuleOptions>(rules: RejectUnknownRuleNames<Rules>): Rules & Linter.RulesRecord =>\n\trules as Rules & Linter.RulesRecord;\n\nexport type { RuleOptions } from \"./typegen\";\n","import type { RuleOptions } from \"../typegen\";\n\n/**\n * 跨 JavaScript、TypeScript 与 Vue 脚本生效的公共规则。\n *\n * 维护约定:每条本地覆写都要说明启用原因;可能造成大面积改动、迁移阻断或\n * 行为变化的规则使用 `[高影响]` 标记,并同步维护 `docs/rules-risk.zh.md`。\n */\nexport const commonRules = {\n\t// 要求数组回调在所有可到达分支返回值,避免 map/filter 等调用静默产生 undefined。\n\t\"array-callback-return\": \"error\",\n\t// 浏览器弹窗通常不适合生产代码,但保留为警告以兼容原型开发和已有项目。\n\t\"no-alert\": \"warn\",\n\t// switch 的 case 不创建词法作用域;要求用花括号包裹声明,避免跨 case 冲突。\n\t\"no-case-declarations\": \"error\",\n\t// 禁止反斜杠续行字符串,优先使用可读性更好的模板字符串。\n\t\"no-multi-str\": \"error\",\n\t// with 会让标识符解析不可预测,并且在严格模式和 ESM 中不可用。\n\t\"no-with\": \"error\",\n\t// 允许用 `void promise` 明确忽略 Promise,但禁止在普通表达式中滥用 void。\n\t\"no-void\": [\n\t\t\"error\",\n\t\t{\n\t\t\tallowAsStatement: true,\n\t\t},\n\t],\n\t// 要求严格相等;保留 `value == null` 同时判断 null/undefined 的常用写法。\n\teqeqeq: [\"error\", \"always\", { null: \"ignore\" }],\n\t// 幂运算统一使用 **,减少 Math.pow 嵌套并保持现代语法风格。\n\t\"prefer-exponentiation-operator\": \"error\",\n\t// 使用 Object.hasOwn,避免对象覆盖或缺少 hasOwnProperty 时产生异常。\n\t\"prefer-object-has-own\": \"error\",\n\n\t// [可自动修复] 声明间顺序交给 import-x;这里只排序同一 import 的成员。\n\t\"sort-imports\": [\n\t\t\"warn\",\n\t\t{\n\t\t\tignoreCase: false,\n\t\t\tignoreDeclarationSort: true,\n\t\t\tignoreMemberSort: false,\n\t\t\tmemberSyntaxSortOrder: [\"none\", \"all\", \"multiple\", \"single\"],\n\t\t\tallowSeparatedGroups: false,\n\t\t},\n\t],\n} satisfies RuleOptions;\n","import type { RuleOptions } from \"../typegen\";\n\n/**\n * 按需启用:要求项目统一使用 lodash-unified。\n * 该组织偏好不会被默认配置加载,使用者需从 `@fast-china/eslint-config/rules` 显式导入。\n */\nexport const importUseLodashUnifiedRules = {\n\t// [高影响][按需启用] 阻止 lodash/lodash-es 及其子路径,启用前应先完成依赖迁移。\n\t\"no-restricted-imports\": [\n\t\t\"error\",\n\t\t{\n\t\t\tpaths: [\n\t\t\t\t{ name: \"lodash\", message: \"Use lodash-unified instead.\" },\n\t\t\t\t{ name: \"lodash-es\", message: \"Use lodash-unified instead.\" },\n\t\t\t],\n\t\t\tpatterns: [\n\t\t\t\t{\n\t\t\t\t\tgroup: [\"lodash/*\", \"lodash-es/*\"],\n\t\t\t\t\tmessage: \"Use lodash-unified instead.\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n} satisfies RuleOptions;\n\n/**\n * 按需启用:要求项目统一使用 lodash。\n * 该组织偏好不会被默认配置加载,使用者需从 rules 子路径显式导入。\n */\nexport const importUseLodashRules = {\n\t// [高影响][按需启用] 阻止 lodash-es/lodash-unified 及其子路径,启用前应先完成依赖迁移。\n\t\"no-restricted-imports\": [\n\t\t\"error\",\n\t\t{\n\t\t\tpaths: [\n\t\t\t\t{ name: \"lodash-es\", message: \"Use lodash instead.\" },\n\t\t\t\t{ name: \"lodash-unified\", message: \"Use lodash instead.\" },\n\t\t\t],\n\t\t\tpatterns: [\n\t\t\t\t{\n\t\t\t\t\tgroup: [\"lodash-es/*\", \"lodash-unified/*\"],\n\t\t\t\t\tmessage: \"Use lodash instead.\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n} satisfies RuleOptions;\n\n/** 默认启用的模块导入正确性与排序规则。 */\nexport const importRules = {\n\t// import 必须位于其他语句之前,避免模块依赖散落在执行逻辑中。\n\t\"import-x/first\": \"error\",\n\t// 合并同一模块的重复 import,避免绑定分散或副作用被误读。\n\t\"import-x/no-duplicates\": \"error\",\n\t// [高影响][可自动修复] 按来源分组并排序;带副作用的裸 import 仅报告,人工移动前必须确认执行顺序。\n\t\"import-x/order\": [\n\t\t\"error\",\n\t\t{\n\t\t\tgroups: [\n\t\t\t\t// Node.js 内置模块\n\t\t\t\t\"builtin\",\n\t\t\t\t// 第三方依赖\n\t\t\t\t\"external\",\n\t\t\t\t// 项目内部别名模块\n\t\t\t\t\"internal\",\n\t\t\t\t// 父级目录模块\n\t\t\t\t\"parent\",\n\t\t\t\t// 同级目录模块\n\t\t\t\t\"sibling\",\n\t\t\t\t// 当前目录入口模块\n\t\t\t\t\"index\",\n\t\t\t\t// TypeScript import = require() 导入\n\t\t\t\t\"object\",\n\t\t\t\t// TypeScript 类型导入\n\t\t\t\t\"type\",\n\t\t\t\t// 无法识别分类的导入\n\t\t\t\t\"unknown\",\n\t\t\t],\n\t\t\t// 不同 import 分组之间必须保留一个空行\n\t\t\t\"newlines-between\": \"always\",\n\t\t\t// 同一分组内按照模块路径字母升序排列\n\t\t\talphabetize: {\n\t\t\t\torder: \"asc\",\n\t\t\t\tcaseInsensitive: true,\n\t\t\t},\n\t\t\t// 对没有赋值给变量的副作用导入进行排序检查\n\t\t\twarnOnUnassignedImports: true,\n\t\t},\n\t],\n\t// [默认关闭] Vite/TypeScript 别名由项目解析器校验,避免共享配置绑定特定 resolver。\n\t\"import-x/no-unresolved\": \"off\",\n\t// [默认关闭] 未配置 resolver 时,namespace 导出的静态分析容易产生误报。\n\t\"import-x/namespace\": \"off\",\n\t// [默认关闭] 未配置 resolver 时,默认导出的静态分析容易产生误报。\n\t\"import-x/default\": \"off\",\n\t// [默认关闭] 不限制同时存在默认导出与相近命名导出的模块 API 风格。\n\t\"import-x/no-named-as-default\": \"off\",\n\t// [默认关闭] 不限制通过默认导入对象访问同名属性的项目 API 风格。\n\t\"import-x/no-named-as-default-member\": \"off\",\n\t// [默认关闭] 未配置 resolver 时,命名导出的静态分析容易产生误报。\n\t\"import-x/named\": \"off\",\n} satisfies RuleOptions;\n","import type { RuleOptions } from \"../typegen\";\n\n/**\n * JavaScript 本地覆写规则。\n * 高影响规则的解释与关闭方式见 `docs/rules-risk.zh.md`。\n */\nexport const javascriptRules = {\n\t// 控制台调用在应用源码中需要人工确认;warn/error 仍可用于必要的诊断输出。\n\t\"no-console\": [\n\t\t\"warn\",\n\t\t{\n\t\t\tallow: [\"warn\", \"error\"],\n\t\t},\n\t],\n\t// 防止调试断点进入发布代码并中断运行。\n\t\"no-debugger\": \"error\",\n\t// 禁止意外的恒定条件,但允许 while (true) 等有明确退出逻辑的循环。\n\t\"no-constant-condition\": [\n\t\t\"error\",\n\t\t{\n\t\t\tcheckLoops: false,\n\t\t},\n\t],\n\t// [高影响] 禁止标签语句;迁移包含多层循环 labeled break/continue 的代码时需先重构控制流。\n\t\"no-restricted-syntax\": [\"error\", \"LabeledStatement\"],\n\t// [高影响][可自动修复] 使用 let/const 替代 var;首次迁移需复核循环闭包和声明提升行为。\n\t\"no-var\": \"error\",\n\t// 禁止无说明的空代码块;允许用于“忽略失败”语义的空 catch。\n\t\"no-empty\": [\n\t\t\"error\",\n\t\t{\n\t\t\tallowEmptyCatch: true,\n\t\t},\n\t],\n\t// 拒绝肉眼难以识别、可能导致解析差异的非常规空白字符。\n\t\"no-irregular-whitespace\": \"error\",\n\t// 变量和类先声明后使用;函数声明允许提升。使用 warn 降低旧项目迁移阻力。\n\t\"no-use-before-define\": [\n\t\t\"warn\",\n\t\t{\n\t\t\tclasses: true,\n\t\t\tfunctions: false,\n\t\t\tvariables: true,\n\t\t},\n\t],\n\t// [可自动修复] 能保持引用不变的变量优先使用 const;读取发生在赋值前时不做不可靠判断。\n\t\"prefer-const\": [\n\t\t\"warn\",\n\t\t{\n\t\t\tdestructuring: \"all\",\n\t\t\tignoreReadBeforeAssign: true,\n\t\t},\n\t],\n\t// [高影响][可自动修复] 优先箭头回调;批量迁移后应复核 this/arguments 与函数名栈信息。\n\t\"prefer-arrow-callback\": [\n\t\t\"error\",\n\t\t{\n\t\t\tallowNamedFunctions: false,\n\t\t\tallowUnboundThis: true,\n\t\t},\n\t],\n\t// [可自动修复] 属性和值同名时使用对象简写,带引号键名不强制改写。\n\t\"object-shorthand\": [\n\t\t\"error\",\n\t\t\"always\",\n\t\t{\n\t\t\tignoreConstructors: false,\n\t\t\tavoidQuotes: true,\n\t\t},\n\t],\n\t// [高影响][可自动修复] 使用 ||=、&&=、??=;涉及 getter/Proxy 的代码应复核求值次数。\n\t\"logical-assignment-operators\": [\"error\", \"always\", { enforceForIfStatements: true }],\n\t// [可自动修复] 合并对象时优先展开语法,避免 Object.assign 的额外目标对象样板。\n\t\"prefer-object-spread\": \"error\",\n\t// 可变参数函数优先 rest 参数,避免依赖类数组 arguments;该规则只报告,不自动改写签名。\n\t\"prefer-rest-params\": \"error\",\n\t// 调用可迭代对象时优先 spread;该规则只报告,避免自动改变 apply 的 this 语义。\n\t\"prefer-spread\": \"error\",\n\t// [可自动修复] 字符串拼接优先模板字符串,便于阅读和多段插值。\n\t\"prefer-template\": \"error\",\n\t// 同一作用域禁止重复声明,避免后声明遮盖前声明。\n\t\"no-redeclare\": \"error\",\n} satisfies RuleOptions;\n","import type { RuleOptions } from \"../typegen\";\n\n/**\n * package.json 属性排序规则。\n *\n * `[高影响][可自动修复]`:默认随 `json: true` 启用,首次修复可能重排大量字段。\n * 注意:这里故意不排序 `exports` 内部键;条件导出的键顺序具有模块解析语义。\n */\nexport const packageJsonSortRules = {\n\t// [高影响][可自动修复] npm 的 files 清单按字母排序;数组顺序不改打包集合,但首次 diff 较大。\n\t\"jsonc/sort-array-values\": [\n\t\t\"error\",\n\t\t{\n\t\t\torder: { type: \"asc\" },\n\t\t\tpathPattern: \"^files$\",\n\t\t},\n\t],\n\t// [高影响][可自动修复] 仅排序明确安全的 package.json 区域,不进入 exports 条件对象。\n\t\"jsonc/sort-keys\": [\n\t\t\"error\",\n\t\t// 根字段按常见阅读顺序组织,减少不同项目之间的清单噪声。\n\t\t{\n\t\t\torder: [\n\t\t\t\t\"name\",\n\t\t\t\t\"version\",\n\t\t\t\t\"private\",\n\t\t\t\t\"packageManager\",\n\t\t\t\t\"description\",\n\t\t\t\t\"type\",\n\t\t\t\t\"keywords\",\n\t\t\t\t\"license\",\n\t\t\t\t\"homepage\",\n\t\t\t\t\"bugs\",\n\t\t\t\t\"repository\",\n\t\t\t\t\"author\",\n\t\t\t\t\"contributors\",\n\t\t\t\t\"funding\",\n\t\t\t\t\"files\",\n\t\t\t\t\"main\",\n\t\t\t\t\"module\",\n\t\t\t\t\"types\",\n\t\t\t\t\"exports\",\n\t\t\t\t\"typesVersions\",\n\t\t\t\t\"sideEffects\",\n\t\t\t\t\"unpkg\",\n\t\t\t\t\"jsdelivr\",\n\t\t\t\t\"browser\",\n\t\t\t\t\"bin\",\n\t\t\t\t\"man\",\n\t\t\t\t\"directories\",\n\t\t\t\t\"publishConfig\",\n\t\t\t\t\"scripts\",\n\t\t\t\t\"peerDependencies\",\n\t\t\t\t\"peerDependenciesMeta\",\n\t\t\t\t\"optionalDependencies\",\n\t\t\t\t\"dependencies\",\n\t\t\t\t\"devDependencies\",\n\t\t\t\t\"engines\",\n\t\t\t\t\"config\",\n\t\t\t\t\"overrides\",\n\t\t\t\t\"pnpm\",\n\t\t\t\t\"husky\",\n\t\t\t\t\"lint-staged\",\n\t\t\t\t\"eslintConfig\",\n\t\t\t\t\"prettier\",\n\t\t\t],\n\t\t\tpathPattern: \"^$\",\n\t\t},\n\t\t// 各类依赖映射按包名排序,方便发现重复或异常依赖。\n\t\t{\n\t\t\torder: { type: \"asc\" },\n\t\t\tpathPattern: \"^(?:dev|peer|optional|bundled)?[Dd]ependencies(Meta)?$\",\n\t\t},\n\t\t// overrides/resolutions 只排序直接键;修改前仍应关注包管理器的模式匹配语义。\n\t\t{\n\t\t\torder: { type: \"asc\" },\n\t\t\tpathPattern: \"^(?:resolutions|overrides|pnpm.overrides)$\",\n\t\t},\n\t],\n} satisfies RuleOptions;\n","import type { RuleOptions } from \"../typegen\";\n\n/**\n * tsconfig.json 属性排序规则。\n *\n * `[高影响][可自动修复]`:默认随 `json: true` 启用,首次修复会重排大量字段,\n * 但只改变 JSONC 的阅读顺序,不改变 TypeScript 编译选项值。\n */\nexport const tsconfigJsonSortRules = {\n\t// tsconfig 是 JSONC,注释用于解释不直观的编译器取舍,必须保留。\n\t\"jsonc/no-comments\": \"off\",\n\n\t// [高影响][可自动修复] 只调整顶层和 compilerOptions 的键顺序,不改写任何选项值或数组。\n\t\"jsonc/sort-keys\": [\n\t\t\"error\",\n\t\t// 顶层按继承、选项、项目引用和文件范围的阅读顺序排列。\n\t\t{\n\t\t\torder: [\"extends\", \"compilerOptions\", \"references\", \"files\", \"include\", \"exclude\"],\n\t\t\tpathPattern: \"^$\",\n\t\t},\n\t\t// compilerOptions 的顺序跟随 TypeScript 文档主题,便于检索和代码审查。\n\t\t{\n\t\t\torder: [\n\t\t\t\t/* Projects */\n\t\t\t\t\"incremental\",\n\t\t\t\t\"composite\",\n\t\t\t\t\"tsBuildInfoFile\",\n\t\t\t\t\"disableSourceOfProjectReferenceRedirect\",\n\t\t\t\t\"disableSolutionSearching\",\n\t\t\t\t\"disableReferencedProjectLoad\",\n\t\t\t\t/* Language and Environment */\n\t\t\t\t\"target\",\n\t\t\t\t\"jsx\",\n\t\t\t\t\"jsxFactory\",\n\t\t\t\t\"jsxFragmentFactory\",\n\t\t\t\t\"jsxImportSource\",\n\t\t\t\t\"lib\",\n\t\t\t\t\"moduleDetection\",\n\t\t\t\t\"noLib\",\n\t\t\t\t\"reactNamespace\",\n\t\t\t\t\"useDefineForClassFields\",\n\t\t\t\t\"emitDecoratorMetadata\",\n\t\t\t\t\"experimentalDecorators\",\n\t\t\t\t/* Modules */\n\t\t\t\t\"baseUrl\",\n\t\t\t\t\"rootDir\",\n\t\t\t\t\"rootDirs\",\n\t\t\t\t\"customConditions\",\n\t\t\t\t\"module\",\n\t\t\t\t\"moduleResolution\",\n\t\t\t\t\"moduleSuffixes\",\n\t\t\t\t\"noResolve\",\n\t\t\t\t\"paths\",\n\t\t\t\t\"resolveJsonModule\",\n\t\t\t\t\"resolvePackageJsonExports\",\n\t\t\t\t\"resolvePackageJsonImports\",\n\t\t\t\t\"typeRoots\",\n\t\t\t\t\"types\",\n\t\t\t\t\"allowArbitraryExtensions\",\n\t\t\t\t\"allowImportingTsExtensions\",\n\t\t\t\t\"allowUmdGlobalAccess\",\n\t\t\t\t/* JavaScript Support */\n\t\t\t\t\"allowJs\",\n\t\t\t\t\"checkJs\",\n\t\t\t\t\"maxNodeModuleJsDepth\",\n\t\t\t\t/* Type Checking */\n\t\t\t\t\"strict\",\n\t\t\t\t\"strictBindCallApply\",\n\t\t\t\t\"strictFunctionTypes\",\n\t\t\t\t\"strictNullChecks\",\n\t\t\t\t\"strictPropertyInitialization\",\n\t\t\t\t\"allowUnreachableCode\",\n\t\t\t\t\"allowUnusedLabels\",\n\t\t\t\t\"alwaysStrict\",\n\t\t\t\t\"exactOptionalPropertyTypes\",\n\t\t\t\t\"noFallthroughCasesInSwitch\",\n\t\t\t\t\"noImplicitAny\",\n\t\t\t\t\"noImplicitOverride\",\n\t\t\t\t\"noImplicitReturns\",\n\t\t\t\t\"noImplicitThis\",\n\t\t\t\t\"noPropertyAccessFromIndexSignature\",\n\t\t\t\t\"noUncheckedIndexedAccess\",\n\t\t\t\t\"noUnusedLocals\",\n\t\t\t\t\"noUnusedParameters\",\n\t\t\t\t\"useUnknownInCatchVariables\",\n\t\t\t\t/* Emit */\n\t\t\t\t\"declaration\",\n\t\t\t\t\"declarationDir\",\n\t\t\t\t\"declarationMap\",\n\t\t\t\t\"downlevelIteration\",\n\t\t\t\t\"emitBOM\",\n\t\t\t\t\"emitDeclarationOnly\",\n\t\t\t\t\"importHelpers\",\n\t\t\t\t\"importsNotUsedAsValues\",\n\t\t\t\t\"inlineSourceMap\",\n\t\t\t\t\"inlineSources\",\n\t\t\t\t\"isolatedDeclarations\",\n\t\t\t\t\"mapRoot\",\n\t\t\t\t\"newLine\",\n\t\t\t\t\"noEmit\",\n\t\t\t\t\"noEmitHelpers\",\n\t\t\t\t\"noEmitOnError\",\n\t\t\t\t\"outDir\",\n\t\t\t\t\"outFile\",\n\t\t\t\t\"preserveConstEnums\",\n\t\t\t\t\"preserveValueImports\",\n\t\t\t\t\"removeComments\",\n\t\t\t\t\"sourceMap\",\n\t\t\t\t\"sourceRoot\",\n\t\t\t\t\"stripInternal\",\n\t\t\t\t/* Interop Constraints */\n\t\t\t\t\"allowSyntheticDefaultImports\",\n\t\t\t\t\"esModuleInterop\",\n\t\t\t\t\"forceConsistentCasingInFileNames\",\n\t\t\t\t\"isolatedModules\",\n\t\t\t\t\"preserveSymlinks\",\n\t\t\t\t\"verbatimModuleSyntax\",\n\t\t\t\t/* Completeness */\n\t\t\t\t\"skipDefaultLibCheck\",\n\t\t\t\t\"skipLibCheck\",\n\t\t\t],\n\t\t\tpathPattern: \"^compilerOptions$\",\n\t\t},\n\t],\n} satisfies RuleOptions;\n","import type { RuleOptions } from \"../typegen\";\n\n/**\n * TypeScript 本地覆写规则。\n * 这里补充 typescript-eslint 预置;高影响规则需同步维护风险文档。\n */\nexport const typescriptRules = {\n\t// 使用 TypeScript 版本避免核心规则误判声明合并、类型和值的同名声明。\n\t\"@typescript-eslint/no-redeclare\": \"error\",\n\t// [高影响][可自动修复] 未使用符号视为错误;以下划线开头可显式表示参数或变量被有意忽略。\n\t\"@typescript-eslint/no-unused-vars\": [\n\t\t\"error\",\n\t\t{\n\t\t\targs: \"after-used\",\n\t\t\targsIgnorePattern: \"^_\",\n\t\t\tcaughtErrors: \"all\",\n\t\t\tcaughtErrorsIgnorePattern: \"^_\",\n\t\t\tignoreRestSiblings: true,\n\t\t\tvarsIgnorePattern: \"^_\",\n\t\t},\n\t],\n\t// [默认关闭] 声明文件、全局扩展和部分 SDK 仍需要 namespace。\n\t\"@typescript-eslint/no-namespace\": \"off\",\n\t// any 会绕过类型检查,但在迁移和第三方边界中有合理用途,因此只警告。\n\t\"@typescript-eslint/no-explicit-any\": \"warn\",\n\t// [高影响] 默认要求 ESM import;CommonJS、动态加载或工具链互操作代码可能需要按文件关闭。\n\t\"@typescript-eslint/no-require-imports\": \"error\",\n\t// 使用 TS 版本识别类型断言等语法;允许常见的短路和三元表达式调用模式。\n\t\"@typescript-eslint/no-unused-expressions\": [\n\t\t\"error\",\n\t\t{\n\t\t\tallowShortCircuit: true,\n\t\t\tallowTernary: true,\n\t\t},\n\t],\n\t// [可自动修复] 删除可由 TypeScript 明确推断的原始值类型标注,减少重复信息。\n\t\"@typescript-eslint/no-inferrable-types\": \"error\",\n\t// 非空断言可能隐藏空值缺陷;以警告提示逐步消除而不阻断迁移。\n\t\"@typescript-eslint/no-non-null-assertion\": \"warn\",\n\t// 可选链之后再做非空断言逻辑矛盾,通常表示边界条件设计有误。\n\t\"@typescript-eslint/no-non-null-asserted-optional-chain\": \"error\",\n\t// [高影响][可自动修复] 类型依赖改用内联 type import;需复核仅靠 import 触发的模块副作用。\n\t\"@typescript-eslint/consistent-type-imports\": [\n\t\t\"error\",\n\t\t{\n\t\t\tdisallowTypeAnnotations: false,\n\t\t\tfixStyle: \"inline-type-imports\",\n\t\t\tprefer: \"type-imports\",\n\t\t},\n\t],\n} satisfies RuleOptions;\n","import type { RuleOptions } from \"../typegen\";\n\n/**\n * Vue SFC 本地覆写规则。\n * 上游 `flat/recommended` 已覆盖基础正确性,这里只记录项目取舍与附加约束。\n */\nexport const vueRules = {\n\t// [安全关注] v-html 可能引入 XSS;保留 warn 以兼容经过净化的富文本场景。\n\t\"vue/no-v-html\": \"warn\",\n\t// [默认关闭] TypeScript 类型 props 和 required 声明已能表达可选性,不强制每个可选 prop 提供默认值。\n\t\"vue/require-default-prop\": \"off\",\n\t// [高影响] 组件必须声明对外事件;旧组件迁移时会暴露未建模的公共事件 API。\n\t\"vue/require-explicit-emits\": \"error\",\n\t// [默认关闭] 允许 App、Layout 等约定俗成的单词组件名。\n\t\"vue/multi-word-component-names\": \"off\",\n\t// 优先从 vue 入口导入由 Vue 重新导出的 API,避免依赖内部包边界。\n\t\"vue/prefer-import-from-vue\": \"warn\",\n\n\t// 防止 props、data、computed、methods 等组件命名空间出现冲突。\n\t\"vue/no-dupe-keys\": \"error\",\n\t// [高影响] 禁止组件直接修改 props,要求通过事件或本地状态维持单向数据流。\n\t\"vue/no-mutating-props\": \"error\",\n\t// 避免自定义组件名与 Vue 内置组件冲突。\n\t\"vue/no-reserved-component-names\": \"error\",\n\t// [安全关注] 禁止在组件节点上使用 v-text/v-html,避免覆盖组件内容和模糊数据边界。\n\t\"vue/no-v-text-v-html-on-component\": \"error\",\n\t// 统一模板与脚本中的自定义事件名称为 camelCase。\n\t\"vue/custom-event-name-casing\": [\"error\", \"camelCase\"],\n\t// [默认关闭] 允许在一个 SFC 中声明仅供当前文件使用的小型辅助组件。\n\t\"vue/one-component-per-file\": \"off\",\n\t// [高影响][可自动修复] 统一模板属性分组;首次启用可能产生大量仅排序的模板差异。\n\t\"vue/attributes-order\": [\n\t\t\"error\",\n\t\t{\n\t\t\torder: [\"DEFINITION\", \"LIST_RENDERING\", \"CONDITIONALS\", \"RENDER_MODIFIERS\", \"GLOBAL\", \"UNIQUE\", \"OTHER_ATTR\", \"EVENTS\", \"CONTENT\"],\n\t\t},\n\t],\n} satisfies RuleOptions;\n"]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# 工程质量审查报告
|
|
2
|
+
|
|
3
|
+
审查日期:2026-07-22
|
|
4
|
+
|
|
5
|
+
审查对象:`@fast-china/eslint-config` 1.0.48 工作区
|
|
6
|
+
|
|
7
|
+
## 结论
|
|
8
|
+
|
|
9
|
+
审查前的仓库具备规则源码和 ESM 打包能力,但不满足“可验证、可发布、可组合”的共享配置库标准。最关键的问题是:构建脚本不能完整结束,仓库自身无法加载导出的 ESLint 配置,发布入口与实际产物不一致,且多个语言配置存在错误的 Flat Config 作用域。
|
|
10
|
+
|
|
11
|
+
本轮优化将仓库重构为以 Vue 3 + Vite 为默认场景、同时支持 JavaScript、Node.js、TypeScript、Vue 2 和类型感知模式的组合式 Flat Config。默认数组导出继续保留,新增的 `createConfig()` 负责显式选择能力。
|
|
12
|
+
|
|
13
|
+
## 审查范围
|
|
14
|
+
|
|
15
|
+
- npm 包元数据、入口、依赖、Node.js 与 ESLint 兼容范围
|
|
16
|
+
- TypeScript 与 tsup 构建链路
|
|
17
|
+
- Flat Config 展开、`files` 交集、插件注册与规则覆盖顺序
|
|
18
|
+
- JavaScript、TypeScript、Vue、JSON 方言、Markdown、RegExp、import 与 Prettier 集成
|
|
19
|
+
- 默认规则的通用性、安全性、性能和项目侵入性
|
|
20
|
+
- README、迁移说明、贡献流程、CI、测试与发布前检查
|
|
21
|
+
|
|
22
|
+
## 主要发现与处置
|
|
23
|
+
|
|
24
|
+
| 级别 | 审查发现 | 影响 | 处置 |
|
|
25
|
+
| ---- | ------------------------------------------------------------------------------- | ------------------------------------------ | ---------------------------------------------------------- |
|
|
26
|
+
| 阻断 | JavaScript 规则引用 `@typescript-eslint/return-await`,但同一作用域没有注册插件 | ESLint 启动即失败 | 移除错误位置的类型感知规则,由可选类型感知预置负责 |
|
|
27
|
+
| 阻断 | 公共规则引用 `@stylistic`,依赖和插件均不存在 | 修复首个错误后仍会启动失败 | 删除与 Prettier 重叠的未注册格式规则 |
|
|
28
|
+
| 阻断 | `build` 依赖未声明的 `tsx`,且 typegen 产物没有公开消费方 | 构建中途失败,生成类型对维护者和使用者无效 | 重建为声明依赖、源码消费、公开导出和漂移检查的类型生成链路 |
|
|
29
|
+
| 阻断 | `main` 指向 `dist/dist/index.js`,`require` 条件指向 ESM | 传统入口不存在,CommonJS 声明失真 | 修正根入口并明确 ESM-only 条件 |
|
|
30
|
+
| 高 | ESLint 10 与 `node >=18.18` 声明冲突 | 支持范围不可兑现 | 对齐 ESLint 10 的 Node.js 运行范围 |
|
|
31
|
+
| 高 | Vue 外层 `*.vue` 与 TypeScript 内层 `*.ts` 形成 AND 交集 | TypeScript 兼容规则在 Vue 文件上失效 | 去除嵌套 TS 文件作用域后再限定到 Vue SFC |
|
|
32
|
+
| 高 | JSON、JSONC、JSON5 三套推荐配置同时叠加 | JSONC/JSON5 被严格 JSON 规则误报 | 按扩展名分别应用对应方言预置 |
|
|
33
|
+
| 高 | JavaScript 推荐配置无 `files`,浏览器与 Node 全局变量混用 | 规则污染 JSON/Markdown,且隐藏运行时错误 | 所有语言组显式限定文件;运行环境成为工厂选项 |
|
|
34
|
+
| 高 | 默认禁止 lodash/lodash-es 并强制 lodash-unified | 通用开源包包含组织策略 | 默认移除,保留为显式规则导出 |
|
|
35
|
+
| 高 | package.json 排序会重排 `exports` 条件键 | 自动修复可能改变 Node 模块解析结果 | 排除整个条件对象并增加顺序保持回归测试 |
|
|
36
|
+
| 中 | Prettier 推荐配置、插件和规则重复注册 | ESLint 变慢且格式化职责混乱 | 仅保留 `eslint-config-prettier`,CLI 单独格式化 |
|
|
37
|
+
| 中 | import resolver 使用 glob 充当扩展名,且 `no-unresolved` 已关闭 | 配置无效并增加原生依赖 | 删除 resolver 与依赖,保留稳定的 import 规则 |
|
|
38
|
+
| 中 | Vue 版本通过 `process.cwd()` 和版本首字符猜测 | 导入结果依赖执行目录,行为不可预测 | Vue 3 明确默认,Vue 2 通过选项选择 |
|
|
39
|
+
| 中 | 无测试、CI、变更日志和发布前门禁 | 回归无法发现,发布不可重复 | 增加 Node 多版本 CI、集成测试、Changelog 与 `prepack` 门禁 |
|
|
40
|
+
|
|
41
|
+
## 分阶段改造
|
|
42
|
+
|
|
43
|
+
### 第一阶段:恢复正确性与可发布性
|
|
44
|
+
|
|
45
|
+
- 修复包入口、ESM 条件、Node.js 引擎和依赖声明。
|
|
46
|
+
- 将两个互相清理输出目录的 tsup 任务合并为一个多入口构建。
|
|
47
|
+
- 更新 TypeScript 为 ES2022 + Bundler 模块解析,并保留严格检查。
|
|
48
|
+
- 删除无效的 typegen 构建耦合、隐式 Vue 探测和缺失插件规则,并在后续阶段重建可验证的类型生成链路。
|
|
49
|
+
|
|
50
|
+
### 第二阶段:重建 Flat Config 组合模型
|
|
51
|
+
|
|
52
|
+
- 每个语言和插件配置均添加明确 `files` 作用域。
|
|
53
|
+
- 增加 `createConfig()`,支持浏览器、Node.js、通用环境和自定义忽略项。
|
|
54
|
+
- 默认使用 Vue 3;Vue 2、类型感知 TypeScript 和类型感知 Vue 均为显式选项。
|
|
55
|
+
- JSON 方言独立配置,Node 工程文件独立追加全局变量。
|
|
56
|
+
- 保留默认数组和历史命名导出,降低迁移成本。
|
|
57
|
+
|
|
58
|
+
### 第三阶段:提高通用性和使用体验
|
|
59
|
+
|
|
60
|
+
- 默认规则以正确性为主,降低显式返回类型等高噪声要求。
|
|
61
|
+
- `v-html` 改为安全提醒,自定义组件上的 `v-html`/`v-text` 继续阻断。
|
|
62
|
+
- 组织专用 lodash 策略退出默认预置。
|
|
63
|
+
- Prettier 与 ESLint 分工,避免编辑器噪声和重复解析。
|
|
64
|
+
- README 提供 Vue/Vite、Node TypeScript、纯 JavaScript 和类型感知示例。
|
|
65
|
+
|
|
66
|
+
### 第四阶段:建立防回归机制
|
|
67
|
+
|
|
68
|
+
- 使用 Node.js 内置测试运行器,直接测试构建后的公开包。
|
|
69
|
+
- 覆盖默认导出、工厂开关、Vue 2、类型感知配置与所有主要文件类型。
|
|
70
|
+
- CI 覆盖 Node.js 20.19、22.13 和 24,并检查发布归档。
|
|
71
|
+
- `pnpm check` 统一构建、类型、lint、格式和测试门禁。
|
|
72
|
+
|
|
73
|
+
### 第五阶段:规则可维护性与风险治理
|
|
74
|
+
|
|
75
|
+
- 每条本地规则覆写都在源码旁说明作用、启用原因和重要例外。
|
|
76
|
+
- 使用 `[高影响]`、`[可自动修复]`、`[安全关注]` 等统一标记维护风险。
|
|
77
|
+
- 增加中英文规则风险指南,公开默认上游预置、高影响清单和按文件降级示例。
|
|
78
|
+
- 禁止排序 `package.json#exports` 条件键,并通过自动修复回归测试锁定这一语义边界。
|
|
79
|
+
- 从 ESLint 和内置插件 schema 生成公开 `RuleOptions`,并用 `defineRules()`、漂移检查和消费者编译测试保证自动补全可用。
|
|
80
|
+
|
|
81
|
+
## 质量门禁
|
|
82
|
+
|
|
83
|
+
发布前必须全部通过:
|
|
84
|
+
|
|
85
|
+
```sh
|
|
86
|
+
pnpm check
|
|
87
|
+
pnpm pack --dry-run
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
验收重点包括:
|
|
91
|
+
|
|
92
|
+
- `dist/index.js`、`dist/index.d.ts`、`dist/rules/index.js` 与 `dist/rules/index.d.ts` 同时存在。
|
|
93
|
+
- 包根入口和 `./rules` 子入口均可通过自身包名导入。
|
|
94
|
+
- JS、TS、Vue、JSON、JSONC、JSON5 和 Markdown 不出现解析器或插件缺失错误。
|
|
95
|
+
- 类型感知选项确实启用 project service。
|
|
96
|
+
- 禁用 Vue、TypeScript 或其他集成后,对应配置不进入结果数组。
|
|
97
|
+
- npm 归档不包含源码缓存、测试缓存或本地依赖目录。
|
|
98
|
+
|
|
99
|
+
## 发布建议与剩余风险
|
|
100
|
+
|
|
101
|
+
- 本轮包含 Node.js 下限、Prettier 行为和模块条件变化,建议作为新的主版本发布,不应直接覆盖为无破坏性补丁版本。
|
|
102
|
+
- 当前包明确以 ESLint 10 为基线;如需支持 ESLint 9,应单独建立依赖矩阵并验证 `@eslint/js` 与语言插件版本,不能只放宽 peer range。
|
|
103
|
+
- Vue 2 为兼容选项,新增规则设计仍以 Vue 3 为主要维护目标。
|
|
104
|
+
- 自动发布没有纳入本轮,避免在未确定 npm trusted publishing、分支保护与维护者审批策略前引入外部写入权限。
|
|
105
|
+
- 依赖升级应由独立变更完成,并在三个 Node.js 版本上重新运行完整门禁。
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Default Rules, Risk Levels, and Maintenance
|
|
2
|
+
|
|
3
|
+
This document records what the default config inherits, which rules can have a large adoption or review cost, and what maintainers must update when changing rules.
|
|
4
|
+
|
|
5
|
+
## Risk labels
|
|
6
|
+
|
|
7
|
+
- `[High impact]`: the rule can create a large diff, block migration, or require a review of runtime or public API behavior.
|
|
8
|
+
- `[Auto-fixable]`: the currently locked ESLint or plugin version declares the rule fixable by `eslint --fix`. It does not remove the need for review.
|
|
9
|
+
- `[Security]`: the rule primarily protects a trust or injection boundary.
|
|
10
|
+
- `[Disabled by default]` and `[Opt-in]`: the rule record exists but is not loaded by the default config.
|
|
11
|
+
|
|
12
|
+
High impact does not mean inherently unsafe. It means adoption or fix review is relatively expensive. Module side effects, getters and proxies, build-tool conventions, and public component APIs deserve particular attention.
|
|
13
|
+
|
|
14
|
+
## Upstream presets enabled by default
|
|
15
|
+
|
|
16
|
+
`createConfig()` defaults to Vue 3, TypeScript, JavaScript, import, RegExp, JSON, Markdown, and the Prettier compatibility layer. Type-aware TypeScript linting is opt-in.
|
|
17
|
+
|
|
18
|
+
| Scope | Inherited preset | Notes |
|
|
19
|
+
| ---------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
20
|
+
| JavaScript | `@eslint/js` `recommended` | Core syntax and runtime correctness, including `no-undef` and `no-unused-vars`. |
|
|
21
|
+
| TypeScript | typescript-eslint `recommended` + `stylistic` | Does not read type information by default; local overrides are applied afterward. |
|
|
22
|
+
| Vue 3 | `@eslint/js`, non-type-aware typescript-eslint presets, and `eslint-plugin-vue` `flat/recommended` | Vue 2 uses `flat/vue2-recommended` only when selected explicitly. |
|
|
23
|
+
| Imports | `eslint-plugin-import-x` `recommended` | Local rules add import placement, deduplication, and ordering. Resolver-dependent checks stay disabled. |
|
|
24
|
+
| RegExp | `eslint-plugin-regexp` `flat/recommended` | Some rules can rewrite regular expressions; run tests after bulk fixes. |
|
|
25
|
+
| JSON dialects | The matching `eslint-plugin-jsonc` `flat/recommended-*` preset | JSON, JSONC, and JSON5 are scoped separately. |
|
|
26
|
+
| Markdown | `@eslint/markdown` `recommended` | Checks Markdown structure and syntax. |
|
|
27
|
+
| Prettier compatibility | `eslint-config-prettier/flat` | Disables conflicting rules only; it does not run Prettier through ESLint. |
|
|
28
|
+
|
|
29
|
+
The exact upstream rule set is defined by the dependency versions in `pnpm-lock.yaml`. Review the effective config with the config inspector whenever ESLint or a plugin is upgraded instead of copying an upstream list that will become stale.
|
|
30
|
+
|
|
31
|
+
## High-impact defaults
|
|
32
|
+
|
|
33
|
+
| Rule | Severity | Auto-fix | Main impact | Recommended review |
|
|
34
|
+
| ------------------------------------------------------- | ---------------- | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
35
|
+
| `jsonc/sort-keys`, `jsonc/sort-array-values` | error | Yes | Reorders `package.json`, `tsconfig*.json`, or the package `files` array and can create a large first-run diff. | Isolate the sorting commit and verify published files. `exports` condition keys are explicitly excluded. |
|
|
36
|
+
| `import-x/order` | error | Yes | Groups and reorders imports. Unassigned side-effect imports are reported but cannot be safely moved automatically. | Check entrypoints, polyfills, styles, and registration imports. |
|
|
37
|
+
| `@typescript-eslint/no-unused-vars` | error | Yes in the locked plugin | Can remove unused imports, variables, or declarations. An underscore prefix is the explicit escape hatch. | Run type checking, builds, and tests after an isolated cleanup. |
|
|
38
|
+
| `@typescript-eslint/consistent-type-imports` | error | Yes | Converts type-only dependencies to inline `type` imports; an import used only for side effects could disappear from emitted code. | Express side effects as a separate `import "module"` and inspect build output. |
|
|
39
|
+
| `@typescript-eslint/no-require-imports` | error | No | Blocks CommonJS, conditional loading, and some toolchain interop patterns. | Disable only for scoped migration or configuration files. |
|
|
40
|
+
| `no-var` | error | Yes | Moves legacy declarations to block scope; hoisting and loop closures need attention. | Run behavior tests, especially around callbacks created in loops. |
|
|
41
|
+
| `prefer-arrow-callback` | error | Yes | Rewrites callbacks; code relying on `this`, `arguments`, or named stack frames needs review. | Check event handlers, library callbacks, and stack traces. |
|
|
42
|
+
| `logical-assignment-operators` | error | Yes | Rewrites conditional assignment; getter and Proxy access counts deserve review. | Test state containers and reactive objects. |
|
|
43
|
+
| `no-restricted-syntax` (`LabeledStatement`) | error | No | Requires control-flow refactoring for labeled break or continue. | Downgrade only in migration files and restore after refactoring. |
|
|
44
|
+
| `sort-imports` | warn | Yes | Sorts members inside one import declaration and usually creates text-only diffs. | Keep it in an isolated cleanup with `import-x/order`. |
|
|
45
|
+
| `vue/require-explicit-emits` | error | No | Makes emitted events an explicit component API and can surface many legacy omissions. | Model the real event list instead of disabling it blindly. |
|
|
46
|
+
| `vue/no-mutating-props` | error | No | Enforces one-way data flow and may require local state or event changes. | Review the fix as a component-design change. |
|
|
47
|
+
| `vue/attributes-order` | error | Yes | Can reorder many template attributes on first use. | Keep template sorting separate from business changes. |
|
|
48
|
+
| `no-unused-vars`, `no-undef` from the JavaScript preset | error | No | Can block legacy JavaScript projects and expose missing runtime-global declarations. | Select the correct `environment` before cleanup. |
|
|
49
|
+
| RegExp recommended preset | Upstream-defined | Some rules | May rewrite character classes, quantifiers, or assertions. | Exercise representative real-world inputs after fixing. |
|
|
50
|
+
|
|
51
|
+
`vue/no-v-html` is also enabled as a warning. It is a security signal rather than an automatic rewrite: HTML must be trusted or reliably sanitized.
|
|
52
|
+
|
|
53
|
+
## High-impact features not enabled by default
|
|
54
|
+
|
|
55
|
+
- Type-aware TypeScript and Vue presets require `typeChecked: true`. They add project-service cost and rules such as `no-floating-promises`.
|
|
56
|
+
- Vue 2 support requires `vue: 2`.
|
|
57
|
+
- `importUseLodashRules` and `importUseLodashUnifiedRules` are organization-specific migration records exported only from `@fast-china/eslint-config/rules`.
|
|
58
|
+
- Resolver-dependent import checks such as `import-x/no-unresolved` and `import-x/named` stay disabled.
|
|
59
|
+
- Keys inside `package.json#exports` are never sorted. Node conditional exports use key order during matching, so reordering can change the loaded file.
|
|
60
|
+
|
|
61
|
+
## Scoped migration overrides
|
|
62
|
+
|
|
63
|
+
Overrides must follow the shared config and should target only the affected files:
|
|
64
|
+
|
|
65
|
+
```js
|
|
66
|
+
import { defineConfig } from "eslint/config";
|
|
67
|
+
|
|
68
|
+
import { createConfig } from "@fast-china/eslint-config";
|
|
69
|
+
|
|
70
|
+
export default defineConfig([
|
|
71
|
+
...createConfig(),
|
|
72
|
+
{
|
|
73
|
+
name: "project/typescript-migration",
|
|
74
|
+
files: ["**/*.{ts,tsx,mts,cts,vue}"],
|
|
75
|
+
rules: {
|
|
76
|
+
"@typescript-eslint/consistent-type-imports": "warn",
|
|
77
|
+
"@typescript-eslint/no-require-imports": "off",
|
|
78
|
+
"@typescript-eslint/no-unused-vars": "warn",
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: "project/vue-migration",
|
|
83
|
+
files: ["**/*.vue"],
|
|
84
|
+
rules: {
|
|
85
|
+
"vue/attributes-order": "warn",
|
|
86
|
+
"vue/require-explicit-emits": "warn",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "project/json-migration",
|
|
91
|
+
files: ["**/{package.json,tsconfig*.json}"],
|
|
92
|
+
rules: {
|
|
93
|
+
"jsonc/sort-array-values": "off",
|
|
94
|
+
"jsonc/sort-keys": "off",
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
]);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Run a read-only lint first, then apply `eslint --fix` on a separate branch or commit. Review imports, side-effect entrypoints, package exports, component events, and manifests before running the project's type checks, build, and tests.
|
|
101
|
+
|
|
102
|
+
## Rule-change checklist
|
|
103
|
+
|
|
104
|
+
1. Every local rule in `src/rules/` must explain its purpose, rationale, and important exception or risk; translating the rule name is not enough.
|
|
105
|
+
2. Add `[High impact]` when appropriate. For fixable rules, verify `meta.fixable` in the installed version instead of relying on memory.
|
|
106
|
+
3. Update this file, `rules-risk.zh.md`, both READMEs, and `CHANGELOG.md` for default behavior changes.
|
|
107
|
+
4. Never sort maps whose key order has semantics, including conditional objects under `package.json#exports`.
|
|
108
|
+
5. Run `pnpm typegen` after changing ESLint or any bundled plugin; inspect and commit `src/typegen.d.ts` instead of editing it manually.
|
|
109
|
+
6. Add integration coverage for parser, plugin, scope, auto-fix, generated-type, and public-export changes.
|
|
110
|
+
7. Run `pnpm check` and `pnpm pack --dry-run`, then inspect the real fix diff.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# 默认规则、风险分级与维护约定
|
|
2
|
+
|
|
3
|
+
本文档回答三个维护问题:默认配置到底继承了什么、哪些规则会显著影响已有项目、修改规则时必须同步检查什么。
|
|
4
|
+
|
|
5
|
+
## 风险标记如何理解
|
|
6
|
+
|
|
7
|
+
源码中的标记采用以下含义:
|
|
8
|
+
|
|
9
|
+
- `[高影响]`:规则可能产生大面积差异、阻断旧项目迁移,或要求人工确认运行时与公共 API 行为。
|
|
10
|
+
- `[可自动修复]`:当前锁定的 ESLint/插件版本声明该规则可被 `eslint --fix` 修改;不代表无需代码审查。
|
|
11
|
+
- `[安全关注]`:规则主要提示注入、信任边界等安全问题。
|
|
12
|
+
- `[默认关闭]`、`[按需启用]`:规则记录存在,但默认配置不会启用。
|
|
13
|
+
|
|
14
|
+
“高影响”不等于规则本身不安全。它表示规则的采用成本或修复审查成本较高。默认自动修复的目标仍是保持语义,但模块副作用、getter/Proxy、构建器约定和公共组件 API 都需要项目维护者复核。
|
|
15
|
+
|
|
16
|
+
## 默认继承的上游预置
|
|
17
|
+
|
|
18
|
+
`createConfig()` 的默认选项是 Vue 3、TypeScript、JavaScript、import、RegExp、JSON、Markdown 与 Prettier 兼容层全部开启;TypeScript 类型感知模式默认关闭。
|
|
19
|
+
|
|
20
|
+
| 范围 | 默认继承 | 说明 |
|
|
21
|
+
| ---------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
|
|
22
|
+
| JavaScript | `@eslint/js` 的 `recommended` | 基础语法和运行时正确性,包括 `no-undef`、`no-unused-vars` 等。 |
|
|
23
|
+
| TypeScript | typescript-eslint 的 `recommended` + `stylistic` | 默认不读取类型信息;本库规则在预置之后覆写。 |
|
|
24
|
+
| Vue 3 | `@eslint/js`、typescript-eslint 非类型感知预置、`eslint-plugin-vue` 的 `flat/recommended` | Vue 2 仅在显式选择时使用 `flat/vue2-recommended`。 |
|
|
25
|
+
| import | `eslint-plugin-import-x` 的 `recommended` | 本库额外配置导入位置、去重和排序。解析器相关规则默认关闭,避免绑定具体别名方案。 |
|
|
26
|
+
| RegExp | `eslint-plugin-regexp` 的 `flat/recommended` | 部分规则可自动改写正则表达式,批量修复后需运行测试。 |
|
|
27
|
+
| JSON/JSONC/JSON5 | `eslint-plugin-jsonc` 对应方言的 `flat/recommended-*` | 三种方言按扩展名隔离,不会互相叠加。 |
|
|
28
|
+
| Markdown | `@eslint/markdown` 的 `recommended` | 检查 Markdown 结构和语法。 |
|
|
29
|
+
| Prettier 兼容 | `eslint-config-prettier/flat` | 只关闭冲突的格式规则,不会在 ESLint 内执行 Prettier。 |
|
|
30
|
+
|
|
31
|
+
上游预置的具体规则集合由锁文件中的依赖版本决定,升级 ESLint 或任一插件时都可能变化。审查实际生效配置时,应以配置检查器和 `pnpm-lock.yaml` 为准,而不是复制一份很快过期的上游规则列表。
|
|
32
|
+
|
|
33
|
+
## 默认启用的高影响规则
|
|
34
|
+
|
|
35
|
+
下表覆盖本库主动设置的高影响规则,以及上游默认预置中最需要在旧项目落地前关注的规则。
|
|
36
|
+
|
|
37
|
+
| 规则 | 等级 | 自动修复 | 主要影响 | 建议 |
|
|
38
|
+
| --------------------------------------------------- | ---------- | ------------------ | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
|
|
39
|
+
| `jsonc/sort-keys`、`jsonc/sort-array-values` | error | 是 | 重排 `package.json`、`tsconfig*.json` 的字段或 `files` 数组,首次运行会产生较大清单差异。 | 单独提交排序结果;确认发布清单。`exports` 条件键已被明确排除。 |
|
|
40
|
+
| `import-x/order` | error | 是 | 重排并分组 import。带副作用的裸 import 会被报告但不会安全地自动移动,人工调整顺序可能改变启动行为。 | 先检查入口、polyfill、样式和注册器 import。 |
|
|
41
|
+
| `@typescript-eslint/no-unused-vars` | error | 是(当前插件版本) | 可能删除未使用的 import、变量或声明;以下划线开头是显式保留出口。 | 在独立提交中修复并运行类型检查、构建和测试。 |
|
|
42
|
+
| `@typescript-eslint/consistent-type-imports` | error | 是 | 将纯类型依赖改成内联 `type` import;若原 import 还承担模块副作用,编译后行为可能变化。 | 副作用应改成独立的 `import "module"`,并复核构建产物。 |
|
|
43
|
+
| `@typescript-eslint/no-require-imports` | error | 否 | 阻断 CommonJS、条件加载和部分工具链互操作写法。 | 在迁移文件或配置文件上按范围关闭,不要全局隐藏。 |
|
|
44
|
+
| `no-var` | error | 是 | 将 `var` 迁移到块级声明;旧代码的提升和循环闭包行为需要关注。 | 先运行现有测试,重点复核循环内回调。 |
|
|
45
|
+
| `prefer-arrow-callback` | error | 是 | 批量改写回调形式,影响 `this`、`arguments` 或函数名调试体验的代码需要人工确认。 | 检查事件处理器、类库回调和栈追踪。 |
|
|
46
|
+
| `logical-assignment-operators` | error | 是 | 将条件赋值改成 ` | | =`、`&&=`、`??=`;getter 或 Proxy 场景要确认读取和写入次数。 | 对状态容器和响应式对象运行行为测试。 |
|
|
47
|
+
| `no-restricted-syntax`(`LabeledStatement`) | error | 否 | 禁止 labeled break/continue,可能要求重构多层循环控制流。 | 迁移期可按文件降级,重构后再恢复。 |
|
|
48
|
+
| `sort-imports` | warn | 是 | 排序同一 import 声明中的成员,通常只产生文本差异。 | 与 `import-x/order` 一起在独立整理提交中执行。 |
|
|
49
|
+
| `vue/require-explicit-emits` | error | 否 | 要求组件声明事件,相当于补全组件公共 API;旧组件可能大量报错。 | 先补齐实际事件清单,不要盲目关闭。 |
|
|
50
|
+
| `vue/no-mutating-props` | error | 否 | 强制单向数据流,可能要求引入本地状态或事件。 | 把修复当作组件设计变更审查。 |
|
|
51
|
+
| `vue/attributes-order` | error | 是 | 首次运行会重排大量模板属性,通常不改变运行逻辑但会形成大 diff。 | 单独提交模板排序,不与业务修改混合。 |
|
|
52
|
+
| `no-unused-vars`、`no-undef`(JavaScript 上游预置) | error | 否 | 旧 JavaScript 项目可能出现大量阻断错误;`no-undef` 还会暴露缺失的运行时全局变量声明。 | 正确选择 `environment`,再逐步清理无用代码。 |
|
|
53
|
+
| RegExp 推荐预置 | 由上游决定 | 部分规则是 | 可能改写字符类、量词或断言;语法等价不代表业务输入覆盖充分。 | 修复后运行覆盖真实输入的正则测试。 |
|
|
54
|
+
|
|
55
|
+
另外,`vue/no-v-html` 默认是 `warn`,属于安全关注而非自动重写规则。它提示调用方必须保证 HTML 来自可信来源或经过可靠净化。
|
|
56
|
+
|
|
57
|
+
## 明确不默认启用的高影响能力
|
|
58
|
+
|
|
59
|
+
- TypeScript 和 Vue 的类型感知预置仅在 `typeChecked: true` 时启用;它们会增加项目服务开销,并启用 `no-floating-promises` 等需要类型信息的规则。
|
|
60
|
+
- Vue 2 兼容预置仅在 `vue: 2` 时启用。
|
|
61
|
+
- `importUseLodashRules` 与 `importUseLodashUnifiedRules` 是组织级迁移策略,只能从 `@fast-china/eslint-config/rules` 显式导入。
|
|
62
|
+
- `import-x/no-unresolved`、`import-x/named` 等依赖 resolver 的检查默认关闭。
|
|
63
|
+
- `package.json` 的 `exports` 条件键永不自动排序。Node 条件导出按键顺序匹配,改写顺序可能改变实际加载文件。
|
|
64
|
+
|
|
65
|
+
## 按项目降低规则强度
|
|
66
|
+
|
|
67
|
+
覆盖项必须放在共享配置之后,并尽量限定文件范围:
|
|
68
|
+
|
|
69
|
+
```js
|
|
70
|
+
import { defineConfig } from "eslint/config";
|
|
71
|
+
|
|
72
|
+
import { createConfig } from "@fast-china/eslint-config";
|
|
73
|
+
|
|
74
|
+
export default defineConfig([
|
|
75
|
+
...createConfig(),
|
|
76
|
+
{
|
|
77
|
+
name: "project/typescript-migration",
|
|
78
|
+
files: ["**/*.{ts,tsx,mts,cts,vue}"],
|
|
79
|
+
rules: {
|
|
80
|
+
"@typescript-eslint/consistent-type-imports": "warn",
|
|
81
|
+
"@typescript-eslint/no-require-imports": "off",
|
|
82
|
+
"@typescript-eslint/no-unused-vars": "warn",
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "project/vue-migration",
|
|
87
|
+
files: ["**/*.vue"],
|
|
88
|
+
rules: {
|
|
89
|
+
"vue/attributes-order": "warn",
|
|
90
|
+
"vue/require-explicit-emits": "warn",
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: "project/json-migration",
|
|
95
|
+
files: ["**/{package.json,tsconfig*.json}"],
|
|
96
|
+
rules: {
|
|
97
|
+
"jsonc/sort-array-values": "off",
|
|
98
|
+
"jsonc/sort-keys": "off",
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
]);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
建议先执行只读检查,再在独立分支或独立提交中运行 `eslint --fix`。重点审查 import、副作用入口、包导出、组件事件和清单文件,并运行项目的类型检查、构建与测试。
|
|
105
|
+
|
|
106
|
+
## 修改规则时的维护清单
|
|
107
|
+
|
|
108
|
+
1. 在 `src/rules/` 对每条本地规则写明“作用、为什么启用、例外或风险”,不要只翻译规则名。
|
|
109
|
+
2. 新增或升级高影响规则时添加 `[高影响]`;可修复规则同时核对当前版本的 `meta.fixable`,不要凭印象标注。
|
|
110
|
+
3. 同步更新本文件和英文版 `rules-risk.md`;默认行为变化还要更新两份 README 与 `CHANGELOG.md`。
|
|
111
|
+
4. 排序规则不得触碰顺序具有语义的映射,例如 `package.json#exports` 条件对象。
|
|
112
|
+
5. ESLint 或任一内置插件版本变化后运行 `pnpm typegen`,审查并提交 `src/typegen.d.ts`;不得手工修改生成声明。
|
|
113
|
+
6. 为解析器、插件、作用域、自动修复、生成类型或公开导出的变化增加集成测试。
|
|
114
|
+
7. 完成后运行 `pnpm check` 和 `pnpm pack --dry-run`,并检查自动修复后的真实 diff。
|