@fast-china/eslint-config 2.1.8 → 2.1.10
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 +61 -22
- package/CONTRIBUTING.md +1 -1
- package/README.md +56 -95
- package/README.zh.md +56 -95
- package/dist/configs/ignores.d.mts +1 -1
- package/dist/configs/ignores.mjs +2 -1
- package/dist/configs/ignores.mjs.map +1 -1
- package/dist/configs/vue.mjs +2 -0
- package/dist/configs/vue.mjs.map +1 -1
- package/dist/constants/index.d.mts +2 -2
- package/dist/constants/index.mjs +3 -2
- package/dist/constants/index.mjs.map +1 -1
- package/package.json +4 -5
- package/docs/engineering-audit.zh.md +0 -78
- package/docs/rules/angular.zh.md +0 -721
- package/docs/rules/core.zh.md +0 -3031
- package/docs/rules/index.zh.md +0 -38
- package/docs/rules/json.zh.md +0 -784
- package/docs/rules/markdown.zh.md +0 -449
- package/docs/rules/react.zh.md +0 -2091
- package/docs/rules/typescript.zh.md +0 -2051
- package/docs/rules/vue.zh.md +0 -3016
- package/docs/rules-risk.md +0 -113
- package/docs/rules-risk.zh.md +0 -113
package/dist/configs/ignores.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import { defineConfig, globalIgnores } from "eslint/config";
|
|
|
3
3
|
import eslintConfigFlatGitignore from "eslint-config-flat-gitignore";
|
|
4
4
|
//#region src/configs/ignores.ts
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* 默认忽略依赖、构建结果、缓存、生成文件、AI 技能内容和工具锁文件。
|
|
7
7
|
*
|
|
8
8
|
* @remarks
|
|
9
9
|
* 不忽略 `src`、`public`、测试夹具或普通 Markdown 文档,避免共享配置静默漏检
|
|
@@ -14,6 +14,7 @@ const DEFAULT_IGNORE_PATTERNS = Object.freeze([
|
|
|
14
14
|
"**/{dist,build,coverage,output,temp,tmp}/**",
|
|
15
15
|
"**/{.cache,.nuxt,.output,.vercel,.nitro}/**",
|
|
16
16
|
"**/{.vitepress/cache,.vite-inspect}/**",
|
|
17
|
+
"**/.agents/**",
|
|
17
18
|
"**/__snapshots__/**",
|
|
18
19
|
"**/*.min.*",
|
|
19
20
|
"**/auto-import?(s).d.ts",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ignores.mjs","names":[],"sources":["../../src/configs/ignores.ts"],"sourcesContent":["import { defineConfig, globalIgnores } from \"eslint/config\";\nimport eslintConfigFlatGitignore from \"eslint-config-flat-gitignore\";\nimport { GLOBS_LOCKFILES } from \"../constants\";\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"ignores.mjs","names":[],"sources":["../../src/configs/ignores.ts"],"sourcesContent":["import { defineConfig, globalIgnores } from \"eslint/config\";\nimport eslintConfigFlatGitignore from \"eslint-config-flat-gitignore\";\nimport { GLOBS_LOCKFILES } from \"../constants\";\n\n/**\n * 默认忽略依赖、构建结果、缓存、生成文件、AI 技能内容和工具锁文件。\n *\n * @remarks\n * 不忽略 `src`、`public`、测试夹具或普通 Markdown 文档,避免共享配置静默漏检\n * 应由项目维护的文件。\n */\nexport const DEFAULT_IGNORE_PATTERNS = Object.freeze([\n\t\"**/{.pnpm-store,node_modules}/**\",\n\t\"**/{dist,build,coverage,output,temp,tmp}/**\",\n\t\"**/{.cache,.nuxt,.output,.vercel,.nitro}/**\",\n\t\"**/{.vitepress/cache,.vite-inspect}/**\",\n\t\"**/.agents/**\",\n\t\"**/__snapshots__/**\",\n\t\"**/*.min.*\",\n\t\"**/auto-import?(s).d.ts\",\n\t\"**/components.d.ts\",\n\t...GLOBS_LOCKFILES,\n]);\n\n/**\n * 创建全局忽略配置,并在默认集合之后追加项目自定义模式。\n *\n * @param additionalPatterns - 追加到 {@link DEFAULT_IGNORE_PATTERNS} 之后的 ESLint 全局忽略模式。\n * @returns 包含单个命名全局忽略片段的 Flat Config 数组。\n */\nexport const createGlobalIgnores = (additionalPatterns: readonly string[] = []): ReturnType<typeof defineConfig> =>\n\tdefineConfig([globalIgnores([...DEFAULT_IGNORE_PATTERNS, ...additionalPatterns], \"@fast-china/ignores/global\")]);\n\n/**\n * 创建读取项目 `.gitignore` 的全局忽略配置。\n *\n * @remarks\n * `.gitignore` 的查找位置由 `eslint-config-flat-gitignore` 根据 ESLint 当前工作目录确定。\n * 未找到文件时不会抛错;该片段也不会替代 {@link createGlobalIgnores} 的内置模式。\n *\n * @returns 包含 `.gitignore` 转换结果的 Flat Config 数组。\n */\nexport const createGitignoreConfigs = (): ReturnType<typeof defineConfig> =>\n\tdefineConfig([\n\t\t{\n\t\t\t...eslintConfigFlatGitignore({ strict: false }),\n\t\t\tname: \"@fast-china/ignores/git\",\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;AAWA,MAAa,0BAA0B,OAAO,OAAO;CACpD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,GAAG;AACJ,CAAC;;;;;;;AAQD,MAAa,uBAAuB,qBAAwC,CAAC,MAC5E,aAAa,CAAC,cAAc,CAAC,GAAG,yBAAyB,GAAG,kBAAkB,GAAG,4BAA4B,CAAC,CAAC;;;;;;;;;;AAWhH,MAAa,+BACZ,aAAa,CACZ;CACC,GAAG,0BAA0B,EAAE,QAAQ,MAAM,CAAC;CAC9C,MAAM;AACP,CACD,CAAC"}
|
package/dist/configs/vue.mjs
CHANGED
|
@@ -39,6 +39,8 @@ const createVueConfigs = (files = [GLOB_VUE], extraFileExtensions = [".vue"]) =>
|
|
|
39
39
|
...javascriptRules,
|
|
40
40
|
...typescriptRules,
|
|
41
41
|
...typescriptTypeCheckedRules,
|
|
42
|
+
/** Vue SFC 允许按模板与运行时兜底处理未穷尽的联合类型或枚举。 */
|
|
43
|
+
"@typescript-eslint/switch-exhaustiveness-check": "off",
|
|
42
44
|
/** SFC 以模板上下文和快速迭代为主,不强制补写函数返回类型。 */
|
|
43
45
|
"@typescript-eslint/explicit-function-return-type": "off",
|
|
44
46
|
/** SFC 的导出宏由 Vue 编译器建立契约,不强制补写普通模块边界类型。 */
|
package/dist/configs/vue.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue.mjs","names":[],"sources":["../../src/configs/vue.ts"],"sourcesContent":["import { defineConfig } from \"eslint/config\";\nimport eslintPluginVue from \"eslint-plugin-vue\";\nimport tseslint from \"typescript-eslint\";\nimport vueEslintParser from \"vue-eslint-parser\";\nimport { GLOB_JSX, GLOB_TSX, GLOB_VUE } from \"../constants\";\nimport { javascriptRules, typescriptRules, typescriptTypeCheckedRules, vueRules, vueScriptRules } from \"../rules\";\nimport { createTypeScriptParserOptions, getTypeScriptPresetConfigs } from \"./typescript\";\n\n/**\n * 创建 Vue 3 单文件组件配置。\n *\n * @remarks\n * Vue 模板解析器通过 `parserOptions.parser` 委托给 typescript-eslint,统一使用类型感知检查。\n * UniApp 项目可传入 `.nvue` 文件范围及对应扩展名;普通 Vue 项目默认只处理 `.vue`。\n *\n * @param files - 应用 Vue 解析器与规则的单文件组件 glob。\n * @param extraFileExtensions - 与同一项目组合中的 TypeScript 配置保持一致的额外扩展名。\n * @returns 包含 Vue 模板、脚本解析器、推荐预置与本地规则的 Flat Config 数组。\n */\nexport const createVueConfigs = (\n\tfiles: readonly string[] = [GLOB_VUE],\n\textraFileExtensions: readonly string[] = [\".vue\"]\n): ReturnType<typeof defineConfig> =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/vue/type-checked\",\n\t\t\tfiles: [...files],\n\t\t\textends: [...getTypeScriptPresetConfigs(), ...eslintPluginVue.configs[\"flat/recommended\"]],\n\t\t\tlanguageOptions: {\n\t\t\t\tecmaVersion: \"latest\",\n\t\t\t\tparser: vueEslintParser,\n\t\t\t\tparserOptions: {\n\t\t\t\t\tparser: tseslint.parser,\n\t\t\t\t\tecmaFeatures: {\n\t\t\t\t\t\tjsx: true,\n\t\t\t\t\t},\n\t\t\t\t\tsourceType: \"module\",\n\t\t\t\t\t...createTypeScriptParserOptions(extraFileExtensions),\n\t\t\t\t},\n\t\t\t},\n\t\t\trules: {\n\t\t\t\t/** Vue SFC 显式接管 TypeScript 预置中的核心规则替换,再由本地策略做最终覆写。 */\n\t\t\t\t...(tseslint.configs.recommendedTypeChecked[1]?.rules ?? {}),\n\t\t\t\t...javascriptRules,\n\t\t\t\t...typescriptRules,\n\t\t\t\t...typescriptTypeCheckedRules,\n\t\t\t\t/** SFC 以模板上下文和快速迭代为主,不强制补写函数返回类型。 */\n\t\t\t\t\"@typescript-eslint/explicit-function-return-type\": \"off\",\n\t\t\t\t/** SFC 的导出宏由 Vue 编译器建立契约,不强制补写普通模块边界类型。 */\n\t\t\t\t\"@typescript-eslint/explicit-module-boundary-types\": \"off\",\n\t\t\t\t/** Vue 模板事件由框架接管异步结果,允许 Promise 返回的事件处理函数;其他 Promise 误用继续检查。 */\n\t\t\t\t\"@typescript-eslint/no-misused-promises\": [\"error\", { checksVoidReturn: { attributes: false } }],\n\t\t\t\t/** `defineEmits` 校验器和框架回调的形参可只声明契约;普通未使用变量和导入仍然报错。 */\n\t\t\t\t\"@typescript-eslint/no-unused-vars\": [\"error\", { args: \"none\", caughtErrors: \"none\", ignoreRestSiblings: true }],\n\t\t\t\t...vueRules,\n\t\t\t},\n\t\t},\n\t]);\n\n/**\n * 创建 Vue JSX 与 TSX 组件脚本语义配置。\n *\n * @remarks\n * `vue-eslint-parser` 会为独立 JSX/TSX 建立 eslint-plugin-vue 所需的组件脚本访问器;\n * TSX 继续委托给 typescript-eslint 并复用项目的 Project Service。这里只加载适用于\n * `defineComponent()`、Options API 与 `setup()` 的脚本规则,不把 kebab-case、模板属性\n * 排序或 `v-text`/`v-html` 等模板节点规则套到 JSX 属性上。\n *\n * @param extraFileExtensions - 与同一项目组合中的 TypeScript 和 SFC 配置保持一致的额外扩展名。\n * @returns 分别处理独立 `.jsx` 与 `.tsx` Vue 组件的 Flat Config 数组。\n */\nexport const createVueJsxConfigs = (extraFileExtensions: readonly string[] = [\".vue\"]): ReturnType<typeof defineConfig> =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/vue/jsx\",\n\t\t\tfiles: [GLOB_JSX],\n\t\t\tplugins: {\n\t\t\t\tvue: eslintPluginVue,\n\t\t\t},\n\t\t\tlanguageOptions: {\n\t\t\t\tecmaVersion: \"latest\",\n\t\t\t\tparser: vueEslintParser,\n\t\t\t\tparserOptions: {\n\t\t\t\t\tecmaFeatures: {\n\t\t\t\t\t\tjsx: true,\n\t\t\t\t\t},\n\t\t\t\t\tsourceType: \"module\",\n\t\t\t\t},\n\t\t\t},\n\t\t\trules: vueScriptRules,\n\t\t},\n\t\t{\n\t\t\tname: \"@fast-china/vue/tsx-type-checked\",\n\t\t\tfiles: [GLOB_TSX],\n\t\t\tplugins: {\n\t\t\t\tvue: eslintPluginVue,\n\t\t\t},\n\t\t\tlanguageOptions: {\n\t\t\t\tecmaVersion: \"latest\",\n\t\t\t\tparser: vueEslintParser,\n\t\t\t\tparserOptions: {\n\t\t\t\t\tparser: tseslint.parser,\n\t\t\t\t\tecmaFeatures: {\n\t\t\t\t\t\tjsx: true,\n\t\t\t\t\t},\n\t\t\t\t\tsourceType: \"module\",\n\t\t\t\t\t...createTypeScriptParserOptions(extraFileExtensions),\n\t\t\t\t},\n\t\t\t},\n\t\t\trules: vueScriptRules,\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmBA,MAAa,oBACZ,QAA2B,CAAC,QAAQ,GACpC,sBAAyC,CAAC,MAAM,MAEhD,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,GAAG,KAAK;CAChB,SAAS,CAAC,GAAG,2BAA2B,GAAG,GAAG,gBAAgB,QAAQ,mBAAmB;CACzF,iBAAiB;EAChB,aAAa;EACb,QAAQ;EACR,eAAe;GACd,QAAQ,SAAS;GACjB,cAAc,EACb,KAAK,KACN;GACA,YAAY;GACZ,GAAG,8BAA8B,mBAAmB;EACrD;CACD;CACA,OAAO;;EAEN,GAAI,SAAS,QAAQ,uBAAuB,EAAE,EAAE,SAAS,CAAC;EAC1D,GAAG;EACH,GAAG;EACH,GAAG;;EAEH,oDAAoD;;EAEpD,qDAAqD;;EAErD,0CAA0C,CAAC,SAAS,EAAE,kBAAkB,EAAE,YAAY,MAAM,EAAE,CAAC;;EAE/F,qCAAqC,CAAC,SAAS;GAAE,MAAM;GAAQ,cAAc;GAAQ,oBAAoB;EAAK,CAAC;EAC/G,GAAG;CACJ;AACD,CACD,CAAC;;;;;;;;;;;;;AAcF,MAAa,uBAAuB,sBAAyC,CAAC,MAAM,MACnF,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,QAAQ;CAChB,SAAS,EACR,KAAK,gBACN;CACA,iBAAiB;EAChB,aAAa;EACb,QAAQ;EACR,eAAe;GACd,cAAc,EACb,KAAK,KACN;GACA,YAAY;EACb;CACD;CACA,OAAO;AACR,GACA;CACC,MAAM;CACN,OAAO,CAAC,QAAQ;CAChB,SAAS,EACR,KAAK,gBACN;CACA,iBAAiB;EAChB,aAAa;EACb,QAAQ;EACR,eAAe;GACd,QAAQ,SAAS;GACjB,cAAc,EACb,KAAK,KACN;GACA,YAAY;GACZ,GAAG,8BAA8B,mBAAmB;EACrD;CACD;CACA,OAAO;AACR,CACD,CAAC"}
|
|
1
|
+
{"version":3,"file":"vue.mjs","names":[],"sources":["../../src/configs/vue.ts"],"sourcesContent":["import { defineConfig } from \"eslint/config\";\nimport eslintPluginVue from \"eslint-plugin-vue\";\nimport tseslint from \"typescript-eslint\";\nimport vueEslintParser from \"vue-eslint-parser\";\nimport { GLOB_JSX, GLOB_TSX, GLOB_VUE } from \"../constants\";\nimport { javascriptRules, typescriptRules, typescriptTypeCheckedRules, vueRules, vueScriptRules } from \"../rules\";\nimport { createTypeScriptParserOptions, getTypeScriptPresetConfigs } from \"./typescript\";\n\n/**\n * 创建 Vue 3 单文件组件配置。\n *\n * @remarks\n * Vue 模板解析器通过 `parserOptions.parser` 委托给 typescript-eslint,统一使用类型感知检查。\n * UniApp 项目可传入 `.nvue` 文件范围及对应扩展名;普通 Vue 项目默认只处理 `.vue`。\n *\n * @param files - 应用 Vue 解析器与规则的单文件组件 glob。\n * @param extraFileExtensions - 与同一项目组合中的 TypeScript 配置保持一致的额外扩展名。\n * @returns 包含 Vue 模板、脚本解析器、推荐预置与本地规则的 Flat Config 数组。\n */\nexport const createVueConfigs = (\n\tfiles: readonly string[] = [GLOB_VUE],\n\textraFileExtensions: readonly string[] = [\".vue\"]\n): ReturnType<typeof defineConfig> =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/vue/type-checked\",\n\t\t\tfiles: [...files],\n\t\t\textends: [...getTypeScriptPresetConfigs(), ...eslintPluginVue.configs[\"flat/recommended\"]],\n\t\t\tlanguageOptions: {\n\t\t\t\tecmaVersion: \"latest\",\n\t\t\t\tparser: vueEslintParser,\n\t\t\t\tparserOptions: {\n\t\t\t\t\tparser: tseslint.parser,\n\t\t\t\t\tecmaFeatures: {\n\t\t\t\t\t\tjsx: true,\n\t\t\t\t\t},\n\t\t\t\t\tsourceType: \"module\",\n\t\t\t\t\t...createTypeScriptParserOptions(extraFileExtensions),\n\t\t\t\t},\n\t\t\t},\n\t\t\trules: {\n\t\t\t\t/** Vue SFC 显式接管 TypeScript 预置中的核心规则替换,再由本地策略做最终覆写。 */\n\t\t\t\t...(tseslint.configs.recommendedTypeChecked[1]?.rules ?? {}),\n\t\t\t\t...javascriptRules,\n\t\t\t\t...typescriptRules,\n\t\t\t\t...typescriptTypeCheckedRules,\n\t\t\t\t/** Vue SFC 允许按模板与运行时兜底处理未穷尽的联合类型或枚举。 */\n\t\t\t\t\"@typescript-eslint/switch-exhaustiveness-check\": \"off\",\n\t\t\t\t/** SFC 以模板上下文和快速迭代为主,不强制补写函数返回类型。 */\n\t\t\t\t\"@typescript-eslint/explicit-function-return-type\": \"off\",\n\t\t\t\t/** SFC 的导出宏由 Vue 编译器建立契约,不强制补写普通模块边界类型。 */\n\t\t\t\t\"@typescript-eslint/explicit-module-boundary-types\": \"off\",\n\t\t\t\t/** Vue 模板事件由框架接管异步结果,允许 Promise 返回的事件处理函数;其他 Promise 误用继续检查。 */\n\t\t\t\t\"@typescript-eslint/no-misused-promises\": [\"error\", { checksVoidReturn: { attributes: false } }],\n\t\t\t\t/** `defineEmits` 校验器和框架回调的形参可只声明契约;普通未使用变量和导入仍然报错。 */\n\t\t\t\t\"@typescript-eslint/no-unused-vars\": [\"error\", { args: \"none\", caughtErrors: \"none\", ignoreRestSiblings: true }],\n\t\t\t\t...vueRules,\n\t\t\t},\n\t\t},\n\t]);\n\n/**\n * 创建 Vue JSX 与 TSX 组件脚本语义配置。\n *\n * @remarks\n * `vue-eslint-parser` 会为独立 JSX/TSX 建立 eslint-plugin-vue 所需的组件脚本访问器;\n * TSX 继续委托给 typescript-eslint 并复用项目的 Project Service。这里只加载适用于\n * `defineComponent()`、Options API 与 `setup()` 的脚本规则,不把 kebab-case、模板属性\n * 排序或 `v-text`/`v-html` 等模板节点规则套到 JSX 属性上。\n *\n * @param extraFileExtensions - 与同一项目组合中的 TypeScript 和 SFC 配置保持一致的额外扩展名。\n * @returns 分别处理独立 `.jsx` 与 `.tsx` Vue 组件的 Flat Config 数组。\n */\nexport const createVueJsxConfigs = (extraFileExtensions: readonly string[] = [\".vue\"]): ReturnType<typeof defineConfig> =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/vue/jsx\",\n\t\t\tfiles: [GLOB_JSX],\n\t\t\tplugins: {\n\t\t\t\tvue: eslintPluginVue,\n\t\t\t},\n\t\t\tlanguageOptions: {\n\t\t\t\tecmaVersion: \"latest\",\n\t\t\t\tparser: vueEslintParser,\n\t\t\t\tparserOptions: {\n\t\t\t\t\tecmaFeatures: {\n\t\t\t\t\t\tjsx: true,\n\t\t\t\t\t},\n\t\t\t\t\tsourceType: \"module\",\n\t\t\t\t},\n\t\t\t},\n\t\t\trules: vueScriptRules,\n\t\t},\n\t\t{\n\t\t\tname: \"@fast-china/vue/tsx-type-checked\",\n\t\t\tfiles: [GLOB_TSX],\n\t\t\tplugins: {\n\t\t\t\tvue: eslintPluginVue,\n\t\t\t},\n\t\t\tlanguageOptions: {\n\t\t\t\tecmaVersion: \"latest\",\n\t\t\t\tparser: vueEslintParser,\n\t\t\t\tparserOptions: {\n\t\t\t\t\tparser: tseslint.parser,\n\t\t\t\t\tecmaFeatures: {\n\t\t\t\t\t\tjsx: true,\n\t\t\t\t\t},\n\t\t\t\t\tsourceType: \"module\",\n\t\t\t\t\t...createTypeScriptParserOptions(extraFileExtensions),\n\t\t\t\t},\n\t\t\t},\n\t\t\trules: vueScriptRules,\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmBA,MAAa,oBACZ,QAA2B,CAAC,QAAQ,GACpC,sBAAyC,CAAC,MAAM,MAEhD,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,GAAG,KAAK;CAChB,SAAS,CAAC,GAAG,2BAA2B,GAAG,GAAG,gBAAgB,QAAQ,mBAAmB;CACzF,iBAAiB;EAChB,aAAa;EACb,QAAQ;EACR,eAAe;GACd,QAAQ,SAAS;GACjB,cAAc,EACb,KAAK,KACN;GACA,YAAY;GACZ,GAAG,8BAA8B,mBAAmB;EACrD;CACD;CACA,OAAO;;EAEN,GAAI,SAAS,QAAQ,uBAAuB,EAAE,EAAE,SAAS,CAAC;EAC1D,GAAG;EACH,GAAG;EACH,GAAG;;EAEH,kDAAkD;;EAElD,oDAAoD;;EAEpD,qDAAqD;;EAErD,0CAA0C,CAAC,SAAS,EAAE,kBAAkB,EAAE,YAAY,MAAM,EAAE,CAAC;;EAE/F,qCAAqC,CAAC,SAAS;GAAE,MAAM;GAAQ,cAAc;GAAQ,oBAAoB;EAAK,CAAC;EAC/G,GAAG;CACJ;AACD,CACD,CAAC;;;;;;;;;;;;;AAcF,MAAa,uBAAuB,sBAAyC,CAAC,MAAM,MACnF,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,QAAQ;CAChB,SAAS,EACR,KAAK,gBACN;CACA,iBAAiB;EAChB,aAAa;EACb,QAAQ;EACR,eAAe;GACd,cAAc,EACb,KAAK,KACN;GACA,YAAY;EACb;CACD;CACA,OAAO;AACR,GACA;CACC,MAAM;CACN,OAAO,CAAC,QAAQ;CAChB,SAAS,EACR,KAAK,gBACN;CACA,iBAAiB;EAChB,aAAa;EACb,QAAQ;EACR,eAAe;GACd,QAAQ,SAAS;GACjB,cAAc,EACb,KAAK,KACN;GACA,YAAY;GACZ,GAAG,8BAA8B,mBAAmB;EACrD;CACD;CACA,OAAO;AACR,CACD,CAAC"}
|
|
@@ -73,7 +73,7 @@ export declare const GLOBS_CODE: readonly ["**/*.{js,cjs,mjs,jsx}", "**/*.{ts,ct
|
|
|
73
73
|
export declare const GLOBS_NODE_TOOLING: readonly ["**/*.{config,setup}.{js,cjs,mjs,jsx,ts,cts,mts,tsx}", "**/{scripts,bin}/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}", "**/{test,tests}/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}", "**/*.{test,spec}.{js,cjs,mjs,jsx,ts,cts,mts,tsx}", "**/cli.{js,cjs,mjs,ts,cts,mts}"];
|
|
74
74
|
/** TypeScript 配置文件;它们使用 JSONC 语法并允许注释。 */
|
|
75
75
|
export declare const GLOBS_TSCONFIG: readonly ["**/tsconfig.json", "**/tsconfig.*.json"];
|
|
76
|
-
/** 不应交给 JSON/Markdown
|
|
77
|
-
export declare const GLOBS_LOCKFILES: readonly ["**/package-lock.json", "**/yarn.lock", "**/pnpm-lock.yaml", "**/bun.lock", "**/bun.lockb", "**/deno.lock"];
|
|
76
|
+
/** 不应交给 JSON/Markdown 解析器处理的包管理器及开发工具锁文件。 */
|
|
77
|
+
export declare const GLOBS_LOCKFILES: readonly ["**/package-lock.json", "**/yarn.lock", "**/pnpm-lock.yaml", "**/bun.lock", "**/bun.lockb", "**/deno.lock", "**/skills-lock.json"];
|
|
78
78
|
//#endregion
|
|
79
79
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/constants/index.mjs
CHANGED
|
@@ -83,14 +83,15 @@ const GLOBS_NODE_TOOLING = [
|
|
|
83
83
|
];
|
|
84
84
|
/** TypeScript 配置文件;它们使用 JSONC 语法并允许注释。 */
|
|
85
85
|
const GLOBS_TSCONFIG = ["**/tsconfig.json", "**/tsconfig.*.json"];
|
|
86
|
-
/** 不应交给 JSON/Markdown
|
|
86
|
+
/** 不应交给 JSON/Markdown 解析器处理的包管理器及开发工具锁文件。 */
|
|
87
87
|
const GLOBS_LOCKFILES = [
|
|
88
88
|
"**/package-lock.json",
|
|
89
89
|
"**/yarn.lock",
|
|
90
90
|
"**/pnpm-lock.yaml",
|
|
91
91
|
"**/bun.lock",
|
|
92
92
|
"**/bun.lockb",
|
|
93
|
-
"**/deno.lock"
|
|
93
|
+
"**/deno.lock",
|
|
94
|
+
"**/skills-lock.json"
|
|
94
95
|
];
|
|
95
96
|
//#endregion
|
|
96
97
|
export { GLOBS_CODE, GLOBS_JAVASCRIPT, GLOBS_LOCKFILES, GLOBS_NODE_TOOLING, GLOBS_TSCONFIG, GLOBS_TYPESCRIPT, GLOBS_UNIAPP_JSON, GLOB_ANGULAR_TEMPLATE, GLOB_ANGULAR_TYPESCRIPT, GLOB_JSON, GLOB_JSON5, GLOB_JSONC, GLOB_JSX, GLOB_MARKDOWN, GLOB_NVUE, GLOB_TSX, GLOB_VUE, UNIAPP_CONDITIONAL_GLOBALS, UNIAPP_GLOBALS };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/constants/index.ts"],"sourcesContent":["/**\n * `@fast-china/eslint-config/constants` 公开的文件匹配常量。\n *\n * @remarks\n * 所有模式均使用 ESLint Flat Config 的 glob 语义,可直接用于配置的 `files` 或\n * `ignores` 字段。数组常量使用只读元组类型,调用方组合时应复制而非原地修改。\n *\n * @packageDocumentation\n */\n\n/** JavaScript 与 JSX 文件;扩展名列表与 Node.js ESM/CJS 约定保持一致。 */\nexport const GLOBS_JAVASCRIPT = [\"**/*.{js,cjs,mjs,jsx}\"] as const;\n\n/** TypeScript 与 TSX 文件;包含 TypeScript 的 ESM/CJS 专用扩展名。 */\nexport const GLOBS_TYPESCRIPT = [\"**/*.{ts,cts,mts,tsx}\"] as const;\n\n/** 独立 JSX 文件;用于为 Vue 等 JSX 运行时叠加组件脚本语义规则。 */\nexport const GLOB_JSX = \"**/*.jsx\";\n\n/** 独立 TSX 文件;用于在完整 TypeScript 范围内叠加 UI 组件专项规则。 */\nexport const GLOB_TSX = \"**/*.tsx\";\n\n/** Vue 3 单文件组件。 */\nexport const GLOB_VUE = \"**/*.vue\";\n\n/** UniApp 原生渲染页面使用的 Vue 单文件组件。 */\nexport const GLOB_NVUE = \"**/*.nvue\";\n\n/** Angular 组件、指令、服务等框架源码;Angular CLI 项目以 `.ts` 为标准源码扩展名。 */\nexport const GLOB_ANGULAR_TYPESCRIPT = \"**/*.ts\";\n\n/** Angular 外部模板;内联模板由 Angular 处理器提取后复用同一模板配置。 */\nexport const GLOB_ANGULAR_TEMPLATE = \"**/*.html\";\n\n/** 严格 JSON 文件。 */\nexport const GLOB_JSON = \"**/*.json\";\n/** 允许注释与尾随逗号的 JSONC 文件。 */\nexport const GLOB_JSONC = \"**/*.jsonc\";\n/** 使用 JSON5 语法的配置文件。 */\nexport const GLOB_JSON5 = \"**/*.json5\";\n\n/** Markdown 文档。 */\nexport const GLOB_MARKDOWN = \"**/*.md\";\n\n/** UniApp 项目允许使用注释的应用清单和页面路由配置。 */\nexport const GLOBS_UNIAPP_JSON = [\"**/manifest.json\", \"**/pages.json\"] as const;\n\n/** UniApp 跨端运行时提供的公共全局变量。 */\nexport const UNIAPP_GLOBALS = {\n\tgetApp: \"readonly\",\n\tgetCurrentPages: \"readonly\",\n\tgetCurrentSubNVue: \"readonly\",\n\tuni: \"readonly\",\n\tuniCloud: \"readonly\",\n} as const;\n\n/**\n * UniApp 条件编译分支中可能由目标平台注入的全局变量。\n *\n * @remarks\n * ESLint 不执行 `#ifdef`/`#endif` 预处理,因此启用 UniApp 后统一声明这些对象。它们只解决\n * 静态 `no-undef`,不会验证当前发行目标是否真的提供对应 API。\n */\nexport const UNIAPP_CONDITIONAL_GLOBALS = {\n\tdd: \"readonly\",\n\tjd: \"readonly\",\n\tks: \"readonly\",\n\tmy: \"readonly\",\n\tplus: \"readonly\",\n\tqh: \"readonly\",\n\tqq: \"readonly\",\n\tswan: \"readonly\",\n\ttt: \"readonly\",\n\tweex: \"readonly\",\n\twx: \"readonly\",\n} as const;\n\n/** 默认由 JavaScript、TypeScript 和 Vue 规则处理的全部代码文件。 */\nexport const GLOBS_CODE = [...GLOBS_JAVASCRIPT, ...GLOBS_TYPESCRIPT, GLOB_VUE] as const;\n\n/**\n * 应额外获得 Node.js 全局变量的工程文件。\n *\n * 这些模式还会与当前已启用的 JavaScript/TypeScript 文件模式做 AND 匹配,\n * 因而关闭 TypeScript 后不会意外让 ESLint 接管 `.ts` 文件。\n */\nexport const GLOBS_NODE_TOOLING = [\n\t\"**/*.{config,setup}.{js,cjs,mjs,jsx,ts,cts,mts,tsx}\",\n\t\"**/{scripts,bin}/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}\",\n\t\"**/{test,tests}/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}\",\n\t\"**/*.{test,spec}.{js,cjs,mjs,jsx,ts,cts,mts,tsx}\",\n\t\"**/cli.{js,cjs,mjs,ts,cts,mts}\",\n] as const;\n\n/** TypeScript 配置文件;它们使用 JSONC 语法并允许注释。 */\nexport const GLOBS_TSCONFIG = [\"**/tsconfig.json\", \"**/tsconfig.*.json\"] as const;\n\n/** 不应交给 JSON/Markdown
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/constants/index.ts"],"sourcesContent":["/**\n * `@fast-china/eslint-config/constants` 公开的文件匹配常量。\n *\n * @remarks\n * 所有模式均使用 ESLint Flat Config 的 glob 语义,可直接用于配置的 `files` 或\n * `ignores` 字段。数组常量使用只读元组类型,调用方组合时应复制而非原地修改。\n *\n * @packageDocumentation\n */\n\n/** JavaScript 与 JSX 文件;扩展名列表与 Node.js ESM/CJS 约定保持一致。 */\nexport const GLOBS_JAVASCRIPT = [\"**/*.{js,cjs,mjs,jsx}\"] as const;\n\n/** TypeScript 与 TSX 文件;包含 TypeScript 的 ESM/CJS 专用扩展名。 */\nexport const GLOBS_TYPESCRIPT = [\"**/*.{ts,cts,mts,tsx}\"] as const;\n\n/** 独立 JSX 文件;用于为 Vue 等 JSX 运行时叠加组件脚本语义规则。 */\nexport const GLOB_JSX = \"**/*.jsx\";\n\n/** 独立 TSX 文件;用于在完整 TypeScript 范围内叠加 UI 组件专项规则。 */\nexport const GLOB_TSX = \"**/*.tsx\";\n\n/** Vue 3 单文件组件。 */\nexport const GLOB_VUE = \"**/*.vue\";\n\n/** UniApp 原生渲染页面使用的 Vue 单文件组件。 */\nexport const GLOB_NVUE = \"**/*.nvue\";\n\n/** Angular 组件、指令、服务等框架源码;Angular CLI 项目以 `.ts` 为标准源码扩展名。 */\nexport const GLOB_ANGULAR_TYPESCRIPT = \"**/*.ts\";\n\n/** Angular 外部模板;内联模板由 Angular 处理器提取后复用同一模板配置。 */\nexport const GLOB_ANGULAR_TEMPLATE = \"**/*.html\";\n\n/** 严格 JSON 文件。 */\nexport const GLOB_JSON = \"**/*.json\";\n/** 允许注释与尾随逗号的 JSONC 文件。 */\nexport const GLOB_JSONC = \"**/*.jsonc\";\n/** 使用 JSON5 语法的配置文件。 */\nexport const GLOB_JSON5 = \"**/*.json5\";\n\n/** Markdown 文档。 */\nexport const GLOB_MARKDOWN = \"**/*.md\";\n\n/** UniApp 项目允许使用注释的应用清单和页面路由配置。 */\nexport const GLOBS_UNIAPP_JSON = [\"**/manifest.json\", \"**/pages.json\"] as const;\n\n/** UniApp 跨端运行时提供的公共全局变量。 */\nexport const UNIAPP_GLOBALS = {\n\tgetApp: \"readonly\",\n\tgetCurrentPages: \"readonly\",\n\tgetCurrentSubNVue: \"readonly\",\n\tuni: \"readonly\",\n\tuniCloud: \"readonly\",\n} as const;\n\n/**\n * UniApp 条件编译分支中可能由目标平台注入的全局变量。\n *\n * @remarks\n * ESLint 不执行 `#ifdef`/`#endif` 预处理,因此启用 UniApp 后统一声明这些对象。它们只解决\n * 静态 `no-undef`,不会验证当前发行目标是否真的提供对应 API。\n */\nexport const UNIAPP_CONDITIONAL_GLOBALS = {\n\tdd: \"readonly\",\n\tjd: \"readonly\",\n\tks: \"readonly\",\n\tmy: \"readonly\",\n\tplus: \"readonly\",\n\tqh: \"readonly\",\n\tqq: \"readonly\",\n\tswan: \"readonly\",\n\ttt: \"readonly\",\n\tweex: \"readonly\",\n\twx: \"readonly\",\n} as const;\n\n/** 默认由 JavaScript、TypeScript 和 Vue 规则处理的全部代码文件。 */\nexport const GLOBS_CODE = [...GLOBS_JAVASCRIPT, ...GLOBS_TYPESCRIPT, GLOB_VUE] as const;\n\n/**\n * 应额外获得 Node.js 全局变量的工程文件。\n *\n * 这些模式还会与当前已启用的 JavaScript/TypeScript 文件模式做 AND 匹配,\n * 因而关闭 TypeScript 后不会意外让 ESLint 接管 `.ts` 文件。\n */\nexport const GLOBS_NODE_TOOLING = [\n\t\"**/*.{config,setup}.{js,cjs,mjs,jsx,ts,cts,mts,tsx}\",\n\t\"**/{scripts,bin}/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}\",\n\t\"**/{test,tests}/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}\",\n\t\"**/*.{test,spec}.{js,cjs,mjs,jsx,ts,cts,mts,tsx}\",\n\t\"**/cli.{js,cjs,mjs,ts,cts,mts}\",\n] as const;\n\n/** TypeScript 配置文件;它们使用 JSONC 语法并允许注释。 */\nexport const GLOBS_TSCONFIG = [\"**/tsconfig.json\", \"**/tsconfig.*.json\"] as const;\n\n/** 不应交给 JSON/Markdown 解析器处理的包管理器及开发工具锁文件。 */\nexport const GLOBS_LOCKFILES = [\n\t\"**/package-lock.json\",\n\t\"**/yarn.lock\",\n\t\"**/pnpm-lock.yaml\",\n\t\"**/bun.lock\",\n\t\"**/bun.lockb\",\n\t\"**/deno.lock\",\n\t\"**/skills-lock.json\",\n] as const;\n"],"mappings":";;;;;;;;;;;AAWA,MAAa,mBAAmB,CAAC,uBAAuB;;AAGxD,MAAa,mBAAmB,CAAC,uBAAuB;;AAGxD,MAAa,WAAW;;AAGxB,MAAa,WAAW;;AAGxB,MAAa,WAAW;;AAGxB,MAAa,YAAY;;AAGzB,MAAa,0BAA0B;;AAGvC,MAAa,wBAAwB;;AAGrC,MAAa,YAAY;;AAEzB,MAAa,aAAa;;AAE1B,MAAa,aAAa;;AAG1B,MAAa,gBAAgB;;AAG7B,MAAa,oBAAoB,CAAC,oBAAoB,eAAe;;AAGrE,MAAa,iBAAiB;CAC7B,QAAQ;CACR,iBAAiB;CACjB,mBAAmB;CACnB,KAAK;CACL,UAAU;AACX;;;;;;;;AASA,MAAa,6BAA6B;CACzC,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,MAAM;CACN,IAAI;CACJ,MAAM;CACN,IAAI;AACL;;AAGA,MAAa,aAAa;CAAC,GAAG;CAAkB,GAAG;CAAkB;AAAQ;;;;;;;AAQ7E,MAAa,qBAAqB;CACjC;CACA;CACA;CACA;CACA;AACD;;AAGA,MAAa,iBAAiB,CAAC,oBAAoB,oBAAoB;;AAGvE,MAAa,kBAAkB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;AACD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fast-china/eslint-config",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.10",
|
|
4
4
|
"description": "Practical, typed ESLint Flat Config for Vue 3, UniApp, React, Angular, Vite, TypeScript, JavaScript, and Node.js.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"vue3"
|
|
19
19
|
],
|
|
20
20
|
"license": "Apache-2.0",
|
|
21
|
-
"homepage": "
|
|
21
|
+
"homepage": "http://fastdotnet.com",
|
|
22
22
|
"bugs": {
|
|
23
23
|
"url": "https://gitee.com/FastDotnet/fast.eslint.config/issues"
|
|
24
24
|
},
|
|
@@ -35,8 +35,7 @@
|
|
|
35
35
|
"README.md",
|
|
36
36
|
"README.zh.md",
|
|
37
37
|
"SECURITY.md",
|
|
38
|
-
"dist"
|
|
39
|
-
"docs"
|
|
38
|
+
"dist"
|
|
40
39
|
],
|
|
41
40
|
"main": "./dist/index.mjs",
|
|
42
41
|
"module": "./dist/index.mjs",
|
|
@@ -83,7 +82,7 @@
|
|
|
83
82
|
"format:check": "prettier --check .",
|
|
84
83
|
"test": "pnpm run build && pnpm run test:types && pnpm run test:runtime && pnpm run test:package",
|
|
85
84
|
"test:types": "tsc --noEmit --project tests/tsconfig.json",
|
|
86
|
-
"test:runtime": "node --test tests/config.test.mjs",
|
|
85
|
+
"test:runtime": "node --test tests/config.test.mjs tests/tool-ignores.test.mjs",
|
|
87
86
|
"test:package": "node --test tests/package.test.mjs",
|
|
88
87
|
"check": "pnpm run typecheck && pnpm run docs:rules:check && pnpm run test && pnpm run lint && pnpm run format:check",
|
|
89
88
|
"prepack": "pnpm run check"
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# 工程质量审查报告
|
|
2
|
-
|
|
3
|
-
审查日期:2026-09-12
|
|
4
|
-
|
|
5
|
-
审查对象:`@fast-china/eslint-config` 2.1.7 工作区
|
|
6
|
-
|
|
7
|
-
## 结论
|
|
8
|
-
|
|
9
|
-
当前配置已从“固定 Vue + UniApp 根预置”调整为根入口的两个独立具名完整配置,并将规则基线收敛到社区通用写法、简洁性和高置信度问题。普通 Vue 项目不再继承 UniApp globals、`.nvue` 解析、清单适配或 `unpackage` 忽略。
|
|
10
|
-
|
|
11
|
-
TypeScript 不再叠加完整 strict/stylistic 类型预置,而是在 `recommendedTypeChecked` 之上明确选择高价值规则。`.ts`/`.tsx` 导出边界继续按 SDK 公共 API 严格检查,内部实现则使用类型推断。
|
|
12
|
-
|
|
13
|
-
## 公共入口
|
|
14
|
-
|
|
15
|
-
- 根入口:命名导出 `vueConfig`、`uniAppConfig`、三个项目工厂、`defineRules()`、`ProjectConfigOptions` 和 `RuleOptions`,不提供默认导出或框架子入口。
|
|
16
|
-
- `./configs`:React、Angular、Markdown、Lodash、清单排序及低层配置片段;完整配置默认包含清单排序。
|
|
17
|
-
- `./constants`、`./rules`:glob/globals 和原始规则记录。
|
|
18
|
-
|
|
19
|
-
本轮不保留旧 `fastConfig()`、根默认导出或 `FastConfigOptions` 兼容层。
|
|
20
|
-
|
|
21
|
-
## 当前规则模型
|
|
22
|
-
|
|
23
|
-
- JavaScript、TypeScript、Import 和 RegExp 只有一套共享规则,SDK 与应用项目不设严格度档位。
|
|
24
|
-
- 完全空的 `catch` 被允许;其他空块继续报错。
|
|
25
|
-
- `no-void` 和 `require-await` 保持错误:不使用 `void` 规避检查,也不保留没有 `await`、会改变函数语义的 `async`。
|
|
26
|
-
- `camelcase: ["error", { properties: "never" }]` 保持错误,兼顾代码命名与外部协议字段。
|
|
27
|
-
- TypeScript 模块导出边界要求显式类型,内部函数返回类型不强制标注。
|
|
28
|
-
- `no-non-null-assertion` 和 `no-unnecessary-condition` 关闭,避免破坏标准断言和运行时防御。
|
|
29
|
-
- Import 位置、重复导入、成员顺序和声明顺序均为错误;保留常用 pathGroups,样式文件单独保持在最后。
|
|
30
|
-
- Vue 使用官方 `flat/recommended`,显式 emits、kebab-case、props 只读、关键正确性规则和属性顺序为错误,`v-html` 风险为警告。
|
|
31
|
-
- `package.json` 和 `tsconfig*.json` 排序保持为所有完整配置的基础能力。
|
|
32
|
-
|
|
33
|
-
## 工程能力
|
|
34
|
-
|
|
35
|
-
| 领域 | 状态 | 质量保障 |
|
|
36
|
-
| ------------- | ---- | ----------------------------------------------------- |
|
|
37
|
-
| 公共 API | 通过 | 根入口具名导出独立 Vue、UniApp 配置和工厂 |
|
|
38
|
-
| JavaScript | 通过 | recommended + 精选正确性和可读性规则 |
|
|
39
|
-
| TypeScript | 通过 | `recommendedTypeChecked` + Project Service + 边界规则 |
|
|
40
|
-
| Vue 3 | 通过 | `.vue` 独立 parser 扩展,不注入 UniApp |
|
|
41
|
-
| UniApp | 通过 | `.vue`/`.nvue`、globals、清单注释和独立忽略项 |
|
|
42
|
-
| Import | 通过 | 正确性、成员/声明顺序和样式末尾均为 error |
|
|
43
|
-
| React/Angular | 通过 | 从框架无关基础配置显式组合 |
|
|
44
|
-
| JSON/RegExp | 通过 | 方言解析与高置信度正确性、安全规则 |
|
|
45
|
-
| 清单排序 | 通过 | 默认启用并保留 `exports` 条件顺序 |
|
|
46
|
-
| 类型生成 | 通过 | 插件 schema 生成精确 `RuleOptions` |
|
|
47
|
-
| 构建发布 | 通过 | ESM、声明文件、根入口具名配置和根目录 `dist/` |
|
|
48
|
-
|
|
49
|
-
## 配置顺序
|
|
50
|
-
|
|
51
|
-
完整配置按以下顺序组合:
|
|
52
|
-
|
|
53
|
-
1. 全局忽略项和 `.gitignore`。
|
|
54
|
-
2. 应用运行环境与 Node.js 工程文件 globals。
|
|
55
|
-
3. Common、JavaScript、Import、RegExp、TypeScript 与 JSON。
|
|
56
|
-
4. `package.json` 与 `tsconfig*.json` 排序。
|
|
57
|
-
5. Vue 或 Vue + UniApp 的独立框架层。
|
|
58
|
-
6. Prettier 冲突关闭层。
|
|
59
|
-
7. Node.js 工程文件末尾覆写。
|
|
60
|
-
8. 调用方后置 Flat Config。
|
|
61
|
-
|
|
62
|
-
## 发布前验证
|
|
63
|
-
|
|
64
|
-
```sh
|
|
65
|
-
pnpm typegen
|
|
66
|
-
pnpm check
|
|
67
|
-
pnpm pack --dry-run
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
发布归档必须包含根入口、`./configs`、`./constants` 和 `./rules`,不得包含源码缓存或本地依赖目录。CI 只负责验证,不自动发布 npm。
|
|
71
|
-
|
|
72
|
-
## 剩余风险
|
|
73
|
-
|
|
74
|
-
- 上游 recommended 会随依赖升级变化,升级 ESLint 或插件后必须检查最终生效配置。
|
|
75
|
-
- 类型感知依赖 tsconfig 覆盖和 Project Service,复杂 monorepo 需要维护清晰的项目边界。
|
|
76
|
-
- `explicit-module-boundary-types` 会要求应用项目中的 `.ts`/`.tsx` 导出也按 SDK 公共接口显式标注,这是本项目有意选择的统一边界。
|
|
77
|
-
- ESLint 无法验证 UniApp 条件编译对象是否处于正确平台分支。
|
|
78
|
-
- `.uvue` 与 `.uts` 仍不在支持范围。
|