@fast-china/eslint-config 1.1.0 → 2.0.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/CHANGELOG.md +25 -0
- package/README.md +106 -80
- package/README.zh.md +107 -81
- package/dist/index.d.ts +110 -236
- package/dist/index.js +241 -218
- package/dist/index.js.map +1 -1
- package/dist/rules/index.d.ts +41 -36
- package/dist/rules/index.js +62 -48
- package/dist/rules/index.js.map +1 -1
- package/docs/engineering-audit.zh.md +73 -82
- package/docs/rules-risk.md +33 -44
- package/docs/rules-risk.zh.md +34 -45
- package/package.json +5 -4
package/dist/rules/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/define-rules.ts","../../src/rules/common.ts","../../src/rules/import.ts","../../src/rules/javascript.ts","../../src/rules/lodash.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 => rules;\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// 浏览器弹窗通常不适合生产代码;使用 warn 允许原型调试,同时确保发布前能够被发现。\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/** 默认启用的模块导入正确性与排序规则。 */\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 * 统一使用 `lodash-unified` 的可选导入策略。\n *\n * 该规则只约束静态 import/export 的模块来源,不会安装依赖,也不会检查动态\n * `import()` 或 CommonJS `require()`。选择此策略的项目应自行安装 `lodash-unified`。\n */\nexport const preferLodashUnifiedRules = {\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{\n\t\t\t\t\tname: \"lodash\",\n\t\t\t\t\tmessage: 'Use \"lodash-unified\" consistently instead of \"lodash\".',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"lodash-es\",\n\t\t\t\t\tmessage: 'Use \"lodash-unified\" consistently instead of \"lodash-es\".',\n\t\t\t\t},\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 exports from \"lodash-unified\" instead of Lodash subpath imports.',\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n} satisfies RuleOptions;\n\n/**\n * 统一使用 `lodash` 的可选导入策略。\n *\n * 根入口和 `lodash/*` 子路径都允许使用;规则只负责避免与 `lodash-es` 或\n * `lodash-unified` 混用,不替项目决定整包导入或按方法导入。\n */\nexport const preferLodashRules = {\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{\n\t\t\t\t\tname: \"lodash-es\",\n\t\t\t\t\tmessage: 'Use \"lodash\" consistently instead of \"lodash-es\".',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"lodash-unified\",\n\t\t\t\t\tmessage: 'Use \"lodash\" consistently instead of \"lodash-unified\".',\n\t\t\t\t},\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\" or a \"lodash/*\" subpath consistently.',\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n} satisfies RuleOptions;\n","import type { RuleOptions } from \"../typegen\";\n\n/**\n * package.json 属性排序规则。\n *\n * `[高影响][可自动修复]`:仅在 `sortPackageJson: 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 * `[高影响][可自动修复]`:仅在 `sortTsconfig: 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"]}
|
|
@@ -1,82 +1,65 @@
|
|
|
1
1
|
# 工程质量审查报告
|
|
2
2
|
|
|
3
|
-
审查日期:2026-07-
|
|
3
|
+
审查日期:2026-07-26
|
|
4
4
|
|
|
5
|
-
审查对象:`@fast-china/eslint-config`
|
|
5
|
+
审查对象:`@fast-china/eslint-config` 2.0.0 工作区
|
|
6
6
|
|
|
7
7
|
## 结论
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
当前仓库已经具备完整 ESLint Flat Config 开源库所需的核心能力:稳定且精简的公共 API、明确的语言作用域、可选类型感知检查、精确规则类型、可重复构建、集成测试、CI、发布归档检查和中英文文档。
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
默认场景面向 Vue 3 + Vite + TypeScript,同时支持 JavaScript、Node.js、JSON、JSONC、JSON5、Markdown、正则表达式和模块导入检查。所有可选能力均通过 `fastConfig(options, ...overrides)` 组合,项目覆写始终位于内置配置之后。
|
|
12
12
|
|
|
13
13
|
## 审查范围
|
|
14
14
|
|
|
15
|
-
- npm
|
|
16
|
-
- TypeScript
|
|
17
|
-
- Flat Config
|
|
18
|
-
- JavaScript、TypeScript、Vue、JSON 方言、Markdown、RegExp
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
|
|
|
37
|
-
|
|
|
38
|
-
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
-
|
|
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()`、漂移检查和消费者编译测试保证自动补全可用。
|
|
15
|
+
- npm 包元数据、ESM 入口、公开子路径与发布文件
|
|
16
|
+
- TypeScript、tsup、类型生成与声明文件
|
|
17
|
+
- ESLint Flat Config 顺序、文件作用域、解析器和插件注册
|
|
18
|
+
- JavaScript、TypeScript、Vue、JSON 方言、Markdown、RegExp 与 import 集成
|
|
19
|
+
- 浏览器、Node.js、通用环境和项目自定义全局变量
|
|
20
|
+
- Lodash 静态导入策略、清单排序与 Prettier 职责边界
|
|
21
|
+
- README、规则风险说明、贡献流程、CI、测试和发布前检查
|
|
22
|
+
|
|
23
|
+
## 当前工程基线
|
|
24
|
+
|
|
25
|
+
| 领域 | 状态 | 质量保障 |
|
|
26
|
+
| -------------- | ---- | ------------------------------------------------------------------------- |
|
|
27
|
+
| 公共 API | 通过 | 根入口提供 `fastConfig`、`defaultConfigOptions`、`defineRules` 和相关类型 |
|
|
28
|
+
| Flat Config | 通过 | 所有语言和插件配置限定到明确文件范围,项目覆写最后应用 |
|
|
29
|
+
| Vue 3 | 通过 | `vue-eslint-parser` 处理 SFC,TypeScript 解析器正确嵌套 |
|
|
30
|
+
| TypeScript | 通过 | 默认使用推荐规则,可选 Project Service 类型感知模式 |
|
|
31
|
+
| JavaScript | 通过 | 应用 `@eslint/js` 推荐规则并区分应用环境与 Node.js 工程文件 |
|
|
32
|
+
| 数据与文档文件 | 通过 | JSON、JSONC、JSON5 和 Markdown 分别使用对应语言配置 |
|
|
33
|
+
| 规则自动补全 | 通过 | 从 ESLint 核心和随包插件 schema 生成精确 `RuleOptions` |
|
|
34
|
+
| Lodash 策略 | 通过 | 可选统一 `lodash` 或 `lodash-unified`,默认不限制项目依赖选择 |
|
|
35
|
+
| 清单排序 | 通过 | 默认关闭;启用后不会重排 `package.json#exports` 条件键 |
|
|
36
|
+
| Prettier | 通过 | 只关闭冲突规则,格式化由 Prettier CLI 或编辑器负责 |
|
|
37
|
+
| 构建与发布 | 通过 | tsup 生成 ESM、声明和 source map,`prepack` 执行完整质量门禁 |
|
|
38
|
+
| 自动化验证 | 通过 | 运行时测试、消费者类型测试、格式检查、静态检查和 Node.js 多版本 CI |
|
|
39
|
+
|
|
40
|
+
## 配置组合模型
|
|
41
|
+
|
|
42
|
+
`fastConfig()` 按以下顺序生成配置:
|
|
43
|
+
|
|
44
|
+
1. 内置忽略项、项目附加忽略项和可选 `.gitignore`。
|
|
45
|
+
2. 应用运行环境、项目全局变量和 Node.js 工程文件全局变量。
|
|
46
|
+
3. JavaScript、import-x、Lodash 策略、RegExp、TypeScript、JSON 方言、Vue 和 Markdown 配置。
|
|
47
|
+
4. 可选 `package.json`、`tsconfig*.json` 排序配置。
|
|
48
|
+
5. Prettier 冲突关闭配置。
|
|
49
|
+
6. 工厂级 `rules` 与调用方传入的文件级覆写。
|
|
50
|
+
|
|
51
|
+
这一顺序保证调用方可以覆盖任何内置规则,同时避免语言规则进入不支持的文件类型。
|
|
52
|
+
|
|
53
|
+
## 规则与类型维护
|
|
54
|
+
|
|
55
|
+
- 每条本地规则旁必须说明作用、启用理由和重要风险。
|
|
56
|
+
- 高影响、可自动修复、安全相关和按需启用规则使用统一标签。
|
|
57
|
+
- 默认高影响规则同步记录在中英文风险指南中。
|
|
58
|
+
- `src/typegen.d.ts` 由规则 schema 生成,不允许手工编辑。
|
|
59
|
+
- ESLint 或插件升级后必须运行 `pnpm typegen` 并审查类型差异。
|
|
60
|
+
- `@fast-china/eslint-config/rules` 提供有完整注释的原始规则记录,便于高级组合。
|
|
61
|
+
|
|
62
|
+
Lodash 选项使用 ESLint 核心 `no-restricted-imports`,因此无需增加插件依赖。它负责防止静态 import/export 混用包入口,不负责安装目标包,也不检查动态 `import()` 或 CommonJS `require()`。
|
|
80
63
|
|
|
81
64
|
## 质量门禁
|
|
82
65
|
|
|
@@ -87,19 +70,27 @@ pnpm check
|
|
|
87
70
|
pnpm pack --dry-run
|
|
88
71
|
```
|
|
89
72
|
|
|
90
|
-
|
|
73
|
+
`pnpm check` 包含:
|
|
91
74
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
75
|
+
1. 生成类型漂移检查。
|
|
76
|
+
2. 正式 ESM 与声明文件构建。
|
|
77
|
+
3. TypeScript 源码类型检查。
|
|
78
|
+
4. ESLint 全仓检查。
|
|
79
|
+
5. Prettier 格式检查。
|
|
80
|
+
6. 消费者类型测试和运行时集成测试。
|
|
98
81
|
|
|
99
|
-
|
|
82
|
+
发布归档必须包含根入口和 `./rules` 子入口的 JavaScript、声明文件和 source map,且不得包含源码缓存、测试缓存或本地依赖目录。
|
|
100
83
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
84
|
+
## CI 与发布边界
|
|
85
|
+
|
|
86
|
+
GitHub Actions 在 `master`、`main` 推送和 Pull Request 上运行,覆盖 Node.js 22.13 和 24。CI 使用 pnpm 11.x、冻结锁文件安装、完整质量门禁和发布归档预览。
|
|
87
|
+
|
|
88
|
+
CI 只验证代码和发布包,不自动发布 npm。正式发布仍由维护者确认版本、Changelog、归档内容和 npm 身份后执行。
|
|
89
|
+
|
|
90
|
+
## 剩余风险
|
|
91
|
+
|
|
92
|
+
- ESLint 和插件推荐预置会随依赖升级变化,每次升级都要检查实际生效配置和生成类型差异。
|
|
93
|
+
- 类型感知模式依赖项目 `tsconfig.json` 覆盖被检查文件,复杂 monorepo 应显式设置 `tsconfigRootDir`。
|
|
94
|
+
- 自动修复可能调整 import、模板属性、正则表达式和清单字段,应在独立提交中审查结果。
|
|
95
|
+
- Lodash 策略只覆盖静态模块语法;需要限制 CommonJS 或动态导入的项目应追加自己的文件级规则或代码审查约定。
|
|
96
|
+
- npm 发布自动化尚未启用,后续应在可信发布、分支保护和维护者审批策略确定后单独设计。
|
package/docs/rules-risk.md
CHANGED
|
@@ -4,7 +4,7 @@ This document records what the default config inherits, which rules can have a l
|
|
|
4
4
|
|
|
5
5
|
## Risk labels
|
|
6
6
|
|
|
7
|
-
- `[High impact]`: the rule can create a large diff, block
|
|
7
|
+
- `[High impact]`: the rule can create a large diff, block existing patterns, or require a review of runtime or public API behavior.
|
|
8
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
9
|
- `[Security]`: the rule primarily protects a trust or injection boundary.
|
|
10
10
|
- `[Disabled by default]` and `[Opt-in]`: the rule record exists but is not loaded by the default config.
|
|
@@ -13,13 +13,13 @@ High impact does not mean inherently unsafe. It means adoption or fix review is
|
|
|
13
13
|
|
|
14
14
|
## Upstream presets enabled by default
|
|
15
15
|
|
|
16
|
-
`
|
|
16
|
+
`fastConfig()` defaults to Vue 3, TypeScript, JavaScript, import, RegExp, JSON, Markdown, and the Prettier compatibility layer. Type-aware TypeScript linting and manifest sorting are opt-in.
|
|
17
17
|
|
|
18
18
|
| Scope | Inherited preset | Notes |
|
|
19
19
|
| ---------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
20
20
|
| JavaScript | `@eslint/js` `recommended` | Core syntax and runtime correctness, including `no-undef` and `no-unused-vars`. |
|
|
21
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
|
|
22
|
+
| Vue 3 | `@eslint/js`, non-type-aware typescript-eslint presets, and `eslint-plugin-vue` `flat/recommended` | Handles Vue 3 SFCs and applies TypeScript rules to `<script lang="ts">` correctly. |
|
|
23
23
|
| Imports | `eslint-plugin-import-x` `recommended` | Local rules add import placement, deduplication, and ordering. Resolver-dependent checks stay disabled. |
|
|
24
24
|
| RegExp | `eslint-plugin-regexp` `flat/recommended` | Some rules can rewrite regular expressions; run tests after bulk fixes. |
|
|
25
25
|
| JSON dialects | The matching `eslint-plugin-jsonc` `flat/recommended-*` preset | JSON, JSONC, and JSON5 are scoped separately. |
|
|
@@ -30,71 +30,60 @@ The exact upstream rule set is defined by the dependency versions in `pnpm-lock.
|
|
|
30
30
|
|
|
31
31
|
## High-impact defaults
|
|
32
32
|
|
|
33
|
-
| Rule | Severity | Auto-fix | Main impact | Recommended review
|
|
34
|
-
| ------------------------------------------------------- | ---------------- | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
35
|
-
| `
|
|
36
|
-
|
|
|
37
|
-
| `@typescript-eslint/
|
|
38
|
-
| `@typescript-eslint/
|
|
39
|
-
|
|
|
40
|
-
| `
|
|
41
|
-
| `
|
|
42
|
-
| `
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `vue/
|
|
46
|
-
| `vue/
|
|
47
|
-
| `
|
|
48
|
-
|
|
|
49
|
-
| RegExp recommended preset | Upstream-defined | Some rules | May rewrite character classes, quantifiers, or assertions. | Exercise representative real-world inputs after fixing. |
|
|
33
|
+
| Rule | Severity | Auto-fix | Main impact | Recommended review |
|
|
34
|
+
| ------------------------------------------------------- | ---------------- | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
|
|
35
|
+
| `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. |
|
|
36
|
+
| `@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. |
|
|
37
|
+
| `@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. |
|
|
38
|
+
| `@typescript-eslint/no-require-imports` | error | No | Blocks CommonJS, conditional loading, and some toolchain interop patterns. | Disable only for configuration files that genuinely require it. |
|
|
39
|
+
| `no-var` | error | Yes | Moves `var` declarations to block scope; hoisting and loop closures need attention. | Run behavior tests, especially around callbacks created in loops. |
|
|
40
|
+
| `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. |
|
|
41
|
+
| `logical-assignment-operators` | error | Yes | Rewrites conditional assignment; getter and Proxy access counts deserve review. | Test state containers and reactive objects. |
|
|
42
|
+
| `no-restricted-syntax` (`LabeledStatement`) | error | No | Requires control-flow refactoring for labeled break or continue. | Downgrade only in affected files and restore after refactoring. |
|
|
43
|
+
| `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`. |
|
|
44
|
+
| `vue/require-explicit-emits` | error | No | Makes emitted events an explicit component API and can surface undeclared events. | Model the real event list instead of disabling it blindly. |
|
|
45
|
+
| `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. |
|
|
46
|
+
| `vue/attributes-order` | error | Yes | Can reorder many template attributes on first use. | Keep template sorting separate from business changes. |
|
|
47
|
+
| `no-unused-vars`, `no-undef` from the JavaScript preset | error | No | Can report many existing issues and expose missing runtime-global declarations. | Select the correct `environment` before cleanup. |
|
|
48
|
+
| RegExp recommended preset | Upstream-defined | Some rules | May rewrite character classes, quantifiers, or assertions. | Exercise representative real-world inputs after fixing. |
|
|
50
49
|
|
|
51
50
|
`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
51
|
|
|
53
52
|
## High-impact features not enabled by default
|
|
54
53
|
|
|
55
54
|
- Type-aware TypeScript and Vue presets require `typeChecked: true`. They add project-service cost and rules such as `no-floating-promises`.
|
|
56
|
-
-
|
|
57
|
-
- `
|
|
55
|
+
- The `jsonc/sort-keys` and `jsonc/sort-array-values` manifest rules require `sortPackageJson: true` or `sortTsconfig: true`. Isolate the first fix and verify the publish manifest.
|
|
56
|
+
- Lodash import restrictions require `lodash: "lodash"` or `lodash: "lodash-unified"`. They use `no-restricted-imports` to prevent mixed static package entry points but do not inspect dynamic `import()` or CommonJS `require()`.
|
|
58
57
|
- Resolver-dependent import checks such as `import-x/no-unresolved` and `import-x/named` stay disabled.
|
|
59
58
|
- Keys inside `package.json#exports` are never sorted. Node conditional exports use key order during matching, so reordering can change the loaded file.
|
|
60
59
|
|
|
61
|
-
## Scoped
|
|
60
|
+
## Scoped overrides
|
|
62
61
|
|
|
63
62
|
Overrides must follow the shared config and should target only the affected files:
|
|
64
63
|
|
|
65
64
|
```js
|
|
66
|
-
import {
|
|
65
|
+
import fastChina, { defineRules } from "@fast-china/eslint-config";
|
|
67
66
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
export default defineConfig([
|
|
71
|
-
...createConfig(),
|
|
67
|
+
export default fastChina(
|
|
68
|
+
{},
|
|
72
69
|
{
|
|
73
|
-
name: "project/typescript-
|
|
70
|
+
name: "project/typescript-exceptions",
|
|
74
71
|
files: ["**/*.{ts,tsx,mts,cts,vue}"],
|
|
75
|
-
rules: {
|
|
72
|
+
rules: defineRules({
|
|
76
73
|
"@typescript-eslint/consistent-type-imports": "warn",
|
|
77
74
|
"@typescript-eslint/no-require-imports": "off",
|
|
78
75
|
"@typescript-eslint/no-unused-vars": "warn",
|
|
79
|
-
},
|
|
76
|
+
}),
|
|
80
77
|
},
|
|
81
78
|
{
|
|
82
|
-
name: "project/vue-
|
|
79
|
+
name: "project/vue-exceptions",
|
|
83
80
|
files: ["**/*.vue"],
|
|
84
|
-
rules: {
|
|
81
|
+
rules: defineRules({
|
|
85
82
|
"vue/attributes-order": "warn",
|
|
86
83
|
"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
|
-
]);
|
|
84
|
+
}),
|
|
85
|
+
}
|
|
86
|
+
);
|
|
98
87
|
```
|
|
99
88
|
|
|
100
89
|
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.
|