@fast-china/eslint-config 2.1.8 → 2.1.9
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 +6 -0
- package/README.md +43 -8
- package/README.zh.md +43 -8
- package/dist/configs/vue.mjs +2 -0
- package/dist/configs/vue.mjs.map +1 -1
- package/docs/engineering-audit.zh.md +2 -2
- package/docs/rules/typescript.zh.md +3 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 2.1.9 - 2026-09-14
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- Disabled `@typescript-eslint/switch-exhaustiveness-check` for Vue single-file components while retaining the error-level check for regular TypeScript and TSX files.
|
|
14
|
+
|
|
9
15
|
## 2.1.8 - 2026-09-12
|
|
10
16
|
|
|
11
17
|
### Added
|
package/README.md
CHANGED
|
@@ -36,8 +36,17 @@ pnpm add -D eslint typescript @fast-china/eslint-config
|
|
|
36
36
|
|
|
37
37
|
```js
|
|
38
38
|
import { vueConfig } from "@fast-china/eslint-config";
|
|
39
|
+
import { defineConfig } from "eslint/config";
|
|
39
40
|
|
|
40
|
-
export default
|
|
41
|
+
export default defineConfig([
|
|
42
|
+
...vueConfig,
|
|
43
|
+
{
|
|
44
|
+
name: "project/custom",
|
|
45
|
+
rules: {
|
|
46
|
+
"no-console": "warn",
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
]);
|
|
41
50
|
```
|
|
42
51
|
|
|
43
52
|
This entry covers JavaScript, type-aware TypeScript, Vue SFCs, and standalone `.jsx`/`.tsx` components used by Vue projects. Vue JSX/TSX keeps checks for explicit emits, duplicate keys, readonly props, reactivity loss, and reserved component names without inheriting template-only kebab-case, attribute-order, or `v-text`/`v-html` rules. The entry also includes JSON, Import, RegExp, `.gitignore`, and Prettier compatibility without loading UniApp capabilities.
|
|
@@ -46,8 +55,18 @@ This entry covers JavaScript, type-aware TypeScript, Vue SFCs, and standalone `.
|
|
|
46
55
|
|
|
47
56
|
```js
|
|
48
57
|
import { uniAppConfig } from "@fast-china/eslint-config";
|
|
58
|
+
import { defineConfig } from "eslint/config";
|
|
49
59
|
|
|
50
|
-
export default
|
|
60
|
+
export default defineConfig([
|
|
61
|
+
...uniAppConfig,
|
|
62
|
+
{
|
|
63
|
+
name: "project/custom",
|
|
64
|
+
ignores: ["src/generated/**"],
|
|
65
|
+
rules: {
|
|
66
|
+
"no-console": "warn",
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
]);
|
|
51
70
|
```
|
|
52
71
|
|
|
53
72
|
The UniApp entry adds `.nvue`, `uni`, `uniCloud`, page APIs, conditional-platform globals, the `unpackage` ignore, and comment handling for `pages.json` and `manifest.json`.
|
|
@@ -60,10 +79,12 @@ The root entry provides explicit named configurations and factories. Use a facto
|
|
|
60
79
|
|
|
61
80
|
```js
|
|
62
81
|
import { createVueProjectConfigs, defineRules } from "@fast-china/eslint-config";
|
|
82
|
+
import { defineConfig } from "eslint/config";
|
|
63
83
|
|
|
64
|
-
export default
|
|
65
|
-
{ environment: "universal" },
|
|
84
|
+
export default defineConfig([
|
|
85
|
+
...createVueProjectConfigs({ environment: "universal" }),
|
|
66
86
|
{
|
|
87
|
+
name: "project/custom",
|
|
67
88
|
ignores: ["public/vendor/**"],
|
|
68
89
|
languageOptions: {
|
|
69
90
|
globals: {
|
|
@@ -73,8 +94,8 @@ export default createVueProjectConfigs(
|
|
|
73
94
|
rules: defineRules({
|
|
74
95
|
"no-console": "warn",
|
|
75
96
|
}),
|
|
76
|
-
}
|
|
77
|
-
);
|
|
97
|
+
},
|
|
98
|
+
]);
|
|
78
99
|
```
|
|
79
100
|
|
|
80
101
|
Available factories:
|
|
@@ -122,7 +143,14 @@ import { createBaseConfigs } from "@fast-china/eslint-config";
|
|
|
122
143
|
import { createReactConfigs } from "@fast-china/eslint-config/configs";
|
|
123
144
|
import { defineConfig } from "eslint/config";
|
|
124
145
|
|
|
125
|
-
export default defineConfig([
|
|
146
|
+
export default defineConfig([
|
|
147
|
+
...createBaseConfigs(),
|
|
148
|
+
...createReactConfigs(),
|
|
149
|
+
{
|
|
150
|
+
name: "project/custom",
|
|
151
|
+
rules: { "no-console": "warn" },
|
|
152
|
+
},
|
|
153
|
+
]);
|
|
126
154
|
```
|
|
127
155
|
|
|
128
156
|
Angular composes `createAngularConfigs()` in the same way. The base configuration loads neither Vue nor UniApp.
|
|
@@ -136,7 +164,14 @@ import { createBaseConfigs } from "@fast-china/eslint-config";
|
|
|
136
164
|
import { createMarkdownConfigs } from "@fast-china/eslint-config/configs";
|
|
137
165
|
import { defineConfig } from "eslint/config";
|
|
138
166
|
|
|
139
|
-
export default defineConfig([
|
|
167
|
+
export default defineConfig([
|
|
168
|
+
...createBaseConfigs({ environment: "node" }),
|
|
169
|
+
...createMarkdownConfigs(),
|
|
170
|
+
{
|
|
171
|
+
name: "project/custom",
|
|
172
|
+
rules: { "no-console": "warn" },
|
|
173
|
+
},
|
|
174
|
+
]);
|
|
140
175
|
```
|
|
141
176
|
|
|
142
177
|
`createBaseConfigs()`, `vueConfig`, and `uniAppConfig` all enable `package.json` and `tsconfig*.json` sorting by default. Package sorting does not enter conditional `exports` objects whose order has runtime meaning.
|
package/README.zh.md
CHANGED
|
@@ -36,8 +36,17 @@ pnpm add -D eslint typescript @fast-china/eslint-config
|
|
|
36
36
|
|
|
37
37
|
```js
|
|
38
38
|
import { vueConfig } from "@fast-china/eslint-config";
|
|
39
|
+
import { defineConfig } from "eslint/config";
|
|
39
40
|
|
|
40
|
-
export default
|
|
41
|
+
export default defineConfig([
|
|
42
|
+
...vueConfig,
|
|
43
|
+
{
|
|
44
|
+
name: "project/custom",
|
|
45
|
+
rules: {
|
|
46
|
+
"no-console": "warn",
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
]);
|
|
41
50
|
```
|
|
42
51
|
|
|
43
52
|
该入口处理 JavaScript、类型感知 TypeScript、Vue SFC,以及 Vue 项目常用的独立 `.jsx`/`.tsx` 组件文件;Vue JSX/TSX 继续检查显式 emits、重复键、只读 props、响应性丢失和保留组件名,但不会套用模板专属的 kebab-case、模板属性排序或 `v-text`/`v-html` 规则。配置同时包含 JSON、Import、RegExp、`.gitignore` 和 Prettier 兼容规则,但不包含任何 UniApp 能力。
|
|
@@ -46,8 +55,18 @@ export default vueConfig;
|
|
|
46
55
|
|
|
47
56
|
```js
|
|
48
57
|
import { uniAppConfig } from "@fast-china/eslint-config";
|
|
58
|
+
import { defineConfig } from "eslint/config";
|
|
49
59
|
|
|
50
|
-
export default
|
|
60
|
+
export default defineConfig([
|
|
61
|
+
...uniAppConfig,
|
|
62
|
+
{
|
|
63
|
+
name: "project/custom",
|
|
64
|
+
ignores: ["src/generated/**"],
|
|
65
|
+
rules: {
|
|
66
|
+
"no-console": "warn",
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
]);
|
|
51
70
|
```
|
|
52
71
|
|
|
53
72
|
UniApp 入口在 Vue 完整能力之外增加 `.nvue`、`uni`、`uniCloud`、页面 API、条件编译平台 globals、`unpackage` 忽略,以及 `pages.json`、`manifest.json` 注释适配。
|
|
@@ -60,10 +79,12 @@ ESLint 不执行 `#ifdef`/`#endif`,因此只能识别平台对象,不能验
|
|
|
60
79
|
|
|
61
80
|
```js
|
|
62
81
|
import { createVueProjectConfigs, defineRules } from "@fast-china/eslint-config";
|
|
82
|
+
import { defineConfig } from "eslint/config";
|
|
63
83
|
|
|
64
|
-
export default
|
|
65
|
-
{ environment: "universal" },
|
|
84
|
+
export default defineConfig([
|
|
85
|
+
...createVueProjectConfigs({ environment: "universal" }),
|
|
66
86
|
{
|
|
87
|
+
name: "project/custom",
|
|
67
88
|
ignores: ["public/vendor/**"],
|
|
68
89
|
languageOptions: {
|
|
69
90
|
globals: {
|
|
@@ -73,8 +94,8 @@ export default createVueProjectConfigs(
|
|
|
73
94
|
rules: defineRules({
|
|
74
95
|
"no-console": "warn",
|
|
75
96
|
}),
|
|
76
|
-
}
|
|
77
|
-
);
|
|
97
|
+
},
|
|
98
|
+
]);
|
|
78
99
|
```
|
|
79
100
|
|
|
80
101
|
可用工厂:
|
|
@@ -122,7 +143,14 @@ import { createBaseConfigs } from "@fast-china/eslint-config";
|
|
|
122
143
|
import { createReactConfigs } from "@fast-china/eslint-config/configs";
|
|
123
144
|
import { defineConfig } from "eslint/config";
|
|
124
145
|
|
|
125
|
-
export default defineConfig([
|
|
146
|
+
export default defineConfig([
|
|
147
|
+
...createBaseConfigs(),
|
|
148
|
+
...createReactConfigs(),
|
|
149
|
+
{
|
|
150
|
+
name: "project/custom",
|
|
151
|
+
rules: { "no-console": "warn" },
|
|
152
|
+
},
|
|
153
|
+
]);
|
|
126
154
|
```
|
|
127
155
|
|
|
128
156
|
Angular 同理组合 `createAngularConfigs()`。基础配置不会加载 Vue 或 UniApp。
|
|
@@ -136,7 +164,14 @@ import { createBaseConfigs } from "@fast-china/eslint-config";
|
|
|
136
164
|
import { createMarkdownConfigs } from "@fast-china/eslint-config/configs";
|
|
137
165
|
import { defineConfig } from "eslint/config";
|
|
138
166
|
|
|
139
|
-
export default defineConfig([
|
|
167
|
+
export default defineConfig([
|
|
168
|
+
...createBaseConfigs({ environment: "node" }),
|
|
169
|
+
...createMarkdownConfigs(),
|
|
170
|
+
{
|
|
171
|
+
name: "project/custom",
|
|
172
|
+
rules: { "no-console": "warn" },
|
|
173
|
+
},
|
|
174
|
+
]);
|
|
140
175
|
```
|
|
141
176
|
|
|
142
177
|
`createBaseConfigs()`、`vueConfig` 和 `uniAppConfig` 都默认启用 `package.json` 与 `tsconfig*.json` 排序。`package.json` 排序不会进入顺序具有运行时语义的条件 `exports` 对象。
|
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"}
|
|
@@ -1134,9 +1134,10 @@ const callback: () => void = () => { log(); };
|
|
|
1134
1134
|
|
|
1135
1135
|
### `@typescript-eslint/switch-exhaustiveness-check`
|
|
1136
1136
|
|
|
1137
|
-
|
|
1137
|
+
Vue SFC 允许按模板与运行时兜底处理未穷尽的联合类型或枚举。
|
|
1138
1138
|
|
|
1139
|
-
- 生效级别与范围:error: TypeScript 基础、框架无关 TSX、Vue
|
|
1139
|
+
- 生效级别与范围:error: TypeScript 基础、框架无关 TSX、Vue TSX、UniApp TSX、React TSX、Angular TypeScript
|
|
1140
|
+
- 关闭范围:Vue SFC、UniApp NVue
|
|
1140
1141
|
- 自动修复:不支持或上游未声明
|
|
1141
1142
|
- 规则来源:[官方文档](https://typescript-eslint.io/rules/switch-exhaustiveness-check)
|
|
1142
1143
|
- 常见报告:`Add branches for missing cases.`;`The switch statement is exhaustive, so the default case is unnecessary.`;`Switch is not exhaustive. Cases not matched: {{missingBranches}}`
|
package/package.json
CHANGED