@fast-china/eslint-config 2.1.9 → 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 +56 -23
- package/CONTRIBUTING.md +1 -1
- package/README.md +44 -118
- package/README.zh.md +44 -118
- 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/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 -2052
- package/docs/rules/vue.zh.md +0 -3016
- package/docs/rules-risk.md +0 -113
- package/docs/rules-risk.zh.md +0 -113
package/README.zh.md
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
<strong>简体中文</strong> | <a href="./README.md">English</a>
|
|
3
|
-
</p>
|
|
1
|
+
**简体中文** | [English](./README.md)
|
|
4
2
|
|
|
5
3
|
<p align="center">
|
|
6
|
-
<img src="./Fast.png"
|
|
4
|
+
<img src="./Fast.png" width="128" alt="Fast.ESLint.Config Logo" />
|
|
7
5
|
</p>
|
|
8
6
|
|
|
9
|
-
|
|
7
|
+
<h1 align="center">Fast.ESLint.Config</h1>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://www.npmjs.com/package/@fast-china/eslint-config"><img src="https://img.shields.io/npm/v/@fast-china/eslint-config?logo=npm" alt="npm version" /></a>
|
|
11
|
+
<a href="https://www.npmjs.com/package/@fast-china/eslint-config"><img src="https://img.shields.io/npm/dm/@fast-china/eslint-config" alt="npm downloads" /></a>
|
|
12
|
+
<a href="./LICENSE"><img src="https://img.shields.io/npm/l/@fast-china/eslint-config" alt="License" /></a>
|
|
13
|
+
</p>
|
|
10
14
|
|
|
11
|
-
面向 Vue 3、
|
|
15
|
+
面向 Vue 3、uni-app、TypeScript 与 Node.js 的 ESLint Flat Config,提供按需框架配置与规则类型。
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
**[使用文档](http://docs.fastdotnet.cn/zh-CN/frontend/eslint-config/) · [官方网站](http://fastdotnet.com)**
|
|
14
18
|
|
|
15
19
|
## 特性
|
|
16
20
|
|
|
@@ -28,11 +32,15 @@
|
|
|
28
32
|
- ESLint `^10.0.0`
|
|
29
33
|
- TypeScript `^6.0.0`
|
|
30
34
|
|
|
35
|
+
## 安装
|
|
36
|
+
|
|
31
37
|
```sh
|
|
32
38
|
pnpm add -D eslint typescript @fast-china/eslint-config
|
|
33
39
|
```
|
|
34
40
|
|
|
35
|
-
##
|
|
41
|
+
## 快速开始
|
|
42
|
+
|
|
43
|
+
在 Vue 3 项目中创建 `eslint.config.mjs`:
|
|
36
44
|
|
|
37
45
|
```js
|
|
38
46
|
import { vueConfig } from "@fast-china/eslint-config";
|
|
@@ -42,139 +50,43 @@ export default defineConfig([
|
|
|
42
50
|
...vueConfig,
|
|
43
51
|
{
|
|
44
52
|
name: "project/custom",
|
|
45
|
-
rules: {
|
|
46
|
-
"no-console": "warn",
|
|
47
|
-
},
|
|
53
|
+
rules: {},
|
|
48
54
|
},
|
|
49
55
|
]);
|
|
50
56
|
```
|
|
51
57
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
## UniApp
|
|
55
|
-
|
|
56
|
-
```js
|
|
57
|
-
import { uniAppConfig } from "@fast-china/eslint-config";
|
|
58
|
-
import { defineConfig } from "eslint/config";
|
|
59
|
-
|
|
60
|
-
export default defineConfig([
|
|
61
|
-
...uniAppConfig,
|
|
62
|
-
{
|
|
63
|
-
name: "project/custom",
|
|
64
|
-
ignores: ["src/generated/**"],
|
|
65
|
-
rules: {
|
|
66
|
-
"no-console": "warn",
|
|
67
|
-
},
|
|
68
|
-
},
|
|
69
|
-
]);
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
UniApp 入口在 Vue 完整能力之外增加 `.nvue`、`uni`、`uniCloud`、页面 API、条件编译平台 globals、`unpackage` 忽略,以及 `pages.json`、`manifest.json` 注释适配。
|
|
73
|
-
|
|
74
|
-
ESLint 不执行 `#ifdef`/`#endif`,因此只能识别平台对象,不能验证对象是否位于正确的平台分支。当前不处理需要专用解析器的 `.uvue` 与 `.uts`。
|
|
75
|
-
|
|
76
|
-
## 工厂与项目覆写
|
|
77
|
-
|
|
78
|
-
根入口只提供含义明确的具名配置与工厂。项目需要选择运行环境或追加覆写时使用对应工厂:
|
|
79
|
-
|
|
80
|
-
```js
|
|
81
|
-
import { createVueProjectConfigs, defineRules } from "@fast-china/eslint-config";
|
|
82
|
-
import { defineConfig } from "eslint/config";
|
|
83
|
-
|
|
84
|
-
export default defineConfig([
|
|
85
|
-
...createVueProjectConfigs({ environment: "universal" }),
|
|
86
|
-
{
|
|
87
|
-
name: "project/custom",
|
|
88
|
-
ignores: ["public/vendor/**"],
|
|
89
|
-
languageOptions: {
|
|
90
|
-
globals: {
|
|
91
|
-
__APP_VERSION__: "readonly",
|
|
92
|
-
},
|
|
93
|
-
},
|
|
94
|
-
rules: defineRules({
|
|
95
|
-
"no-console": "warn",
|
|
96
|
-
}),
|
|
97
|
-
},
|
|
98
|
-
]);
|
|
58
|
+
```sh
|
|
59
|
+
pnpm exec eslint .
|
|
99
60
|
```
|
|
100
61
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
- `createVueProjectConfigs(options, ...overrides)`
|
|
104
|
-
- `createUniAppProjectConfigs(options, ...overrides)`
|
|
105
|
-
- `createBaseConfigs(options)`:不绑定前端框架,适用于 Node.js、SDK 及其他显式组合场景
|
|
106
|
-
|
|
107
|
-
`environment` 可为 `"browser"`、`"node"` 或 `"universal"`,默认是 `"browser"`。配置文件、脚本、测试和 CLI 文件始终单独获得 Node.js globals。
|
|
108
|
-
|
|
109
|
-
后置 Flat Config 拥有最高优先级。`defineRules()` 不修改传入对象,只提供精确规则类型检查。
|
|
110
|
-
|
|
111
|
-
## TypeScript 策略
|
|
62
|
+
类型感知检查的源码应属于项目 tsconfig 范围。Vue 配置不包含 uni-app 平台能力。
|
|
112
63
|
|
|
113
|
-
|
|
64
|
+
## 常见用法
|
|
114
65
|
|
|
115
|
-
-
|
|
116
|
-
- `.tsx` 默认关闭模块边界类型强制:组件 Props 继续接受 TypeScript 检查,但不要求补写可稳定推断的 JSX 返回类型。
|
|
117
|
-
- `explicit-function-return-type: "off"`:内部函数、局部处理函数和内联回调使用 TypeScript 推断。
|
|
118
|
-
- `no-inferrable-types` 不删除参数和属性上的显式类型。
|
|
119
|
-
- Vue/NVue SFC 与独立 TSX 组件不强制模块边界和函数返回类型,以保留常见简洁写法。
|
|
120
|
-
- `no-floating-promises` 关闭;是否等待 Promise 由业务顺序和异常语义决定。
|
|
121
|
-
- `no-void: "error"`:不使用 `void promise` 或其他 `void` 表达式规避检查。
|
|
122
|
-
- `require-await: "error"`:没有真实 `await` 的函数应删除 `async`,避免改变返回值和异常语义。
|
|
123
|
-
- `no-misused-promises`、`await-thenable`、unsafe 类型规则及精选的高置信度类型规则保持为错误。
|
|
124
|
-
- 标准非空断言可用;矛盾、重复或无效的断言仍由专项规则检查。
|
|
125
|
-
- 数字和布尔值可直接用于模板字符串;运行时防御性条件不会因类型看似多余而报错。
|
|
126
|
-
|
|
127
|
-
## JavaScript、Import 与 Vue 策略
|
|
128
|
-
|
|
129
|
-
- `no-empty` 允许完全空的 `catch`,其他空代码块仍报错。
|
|
130
|
-
- `camelcase: ["error", { properties: "never" }]`:变量和类型使用 camelCase,外部协议对象属性保持原名。
|
|
131
|
-
- `no-eval`、`no-implied-eval`、`no-new-func`、`no-debugger` 等真实风险规则为错误。
|
|
132
|
-
- `import-x/first`、`import-x/no-duplicates` 与 `import-x/order` 均为错误;声明顺序支持自动修复。
|
|
133
|
-
- 保留 UniApp、Vue、React、Angular、Vite、Element Plus、Fast 和 Lodash 等常用 pathGroups,`@/**` 归入 internal,类型导入不参与 pathGroups 匹配。
|
|
134
|
-
- `sort-imports` 只检查同一 import 声明 `{}` 内的成员顺序,不接管声明之间的排序。
|
|
135
|
-
- `import-x/style-imports-last` 要求样式文件形成最后一个连续分组,同时不改变样式组内部顺序。
|
|
136
|
-
- Vue SFC 使用官方 `flat/recommended`;显式 emits、重复键、只读 props、响应性丢失和保留组件名等脚本语义规则也应用于 Vue JSX/TSX。
|
|
137
|
-
- kebab-case 属性、模板属性顺序和组件上的 `v-text`/`v-html` 仅检查 `.vue/.nvue` 模板;JSX 属性继续遵循 JavaScript 的 camelCase 约定。`no-v-html` 保持警告。
|
|
138
|
-
|
|
139
|
-
## React 与 Angular
|
|
66
|
+
uni-app 使用独立入口,不与 Vue 完整配置叠加:
|
|
140
67
|
|
|
141
68
|
```js
|
|
142
|
-
import {
|
|
143
|
-
import { createReactConfigs } from "@fast-china/eslint-config/configs";
|
|
69
|
+
import { uniAppConfig } from "@fast-china/eslint-config";
|
|
144
70
|
import { defineConfig } from "eslint/config";
|
|
145
71
|
|
|
146
72
|
export default defineConfig([
|
|
147
|
-
...
|
|
148
|
-
...createReactConfigs(),
|
|
73
|
+
...uniAppConfig,
|
|
149
74
|
{
|
|
150
75
|
name: "project/custom",
|
|
151
|
-
rules: {
|
|
76
|
+
rules: {},
|
|
152
77
|
},
|
|
153
78
|
]);
|
|
154
79
|
```
|
|
155
80
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
## 可选能力与清单排序
|
|
159
|
-
|
|
160
|
-
Markdown 和 Lodash 导入策略需要显式组合:
|
|
81
|
+
不绑定框架的 Node.js 项目:
|
|
161
82
|
|
|
162
83
|
```js
|
|
163
84
|
import { createBaseConfigs } from "@fast-china/eslint-config";
|
|
164
|
-
import { createMarkdownConfigs } from "@fast-china/eslint-config/configs";
|
|
165
|
-
import { defineConfig } from "eslint/config";
|
|
166
85
|
|
|
167
|
-
export default
|
|
168
|
-
...createBaseConfigs({ environment: "node" }),
|
|
169
|
-
...createMarkdownConfigs(),
|
|
170
|
-
{
|
|
171
|
-
name: "project/custom",
|
|
172
|
-
rules: { "no-console": "warn" },
|
|
173
|
-
},
|
|
174
|
-
]);
|
|
86
|
+
export default createBaseConfigs({ environment: "node" });
|
|
175
87
|
```
|
|
176
88
|
|
|
177
|
-
|
|
89
|
+
将项目自定义配置放在共享配置之后;`rules: {}` 留给项目按需填写。需要调整运行环境时,可使用配置工厂。Fast 生态的本地规则副本继续按各仓库 AGENTS.md 同步,不因示例而改成安装配置包。
|
|
178
90
|
|
|
179
91
|
## 公共入口
|
|
180
92
|
|
|
@@ -189,8 +101,8 @@ Prettier 不作为 ESLint 规则运行。默认配置只加载 `eslint-config-pr
|
|
|
189
101
|
|
|
190
102
|
## 文档
|
|
191
103
|
|
|
192
|
-
- [完整规则手册](
|
|
193
|
-
- [默认规则与风险指南](
|
|
104
|
+
- [完整规则手册](http://docs.fastdotnet.cn/zh-CN/frontend/eslint-config/rules/)
|
|
105
|
+
- [默认规则与风险指南](http://docs.fastdotnet.cn/zh-CN/frontend/eslint-config/rules-risk)
|
|
194
106
|
- [工程质量审查报告](./docs/engineering-audit.zh.md)
|
|
195
107
|
- [更新日志](./CHANGELOG.md)
|
|
196
108
|
|
|
@@ -203,3 +115,17 @@ pnpm install --frozen-lockfile
|
|
|
203
115
|
pnpm typegen
|
|
204
116
|
pnpm check
|
|
205
117
|
```
|
|
118
|
+
|
|
119
|
+
## 贡献与安全
|
|
120
|
+
|
|
121
|
+
[贡献指南](./CONTRIBUTING.md) · [安全策略](./SECURITY.md)
|
|
122
|
+
|
|
123
|
+
## 版权、许可证与使用声明
|
|
124
|
+
|
|
125
|
+
版权所有 © 2018-Now 小方。本项目依据 [Apache License 2.0](./LICENSE) 开源;在遵守许可证的前提下,可以使用、修改和分发本软件,包括商业使用。
|
|
126
|
+
|
|
127
|
+
再分发时,应按许可证要求提供许可证副本、对修改的文件作出显著说明,并保留适用的版权和归属声明;包含需要保留的 NOTICE 信息时一并处理。本说明不替代正式许可证,也不额外要求在产品界面展示作者或项目标识。
|
|
128
|
+
|
|
129
|
+
使用者应就自身使用、二次开发、部署、数据处理及运营活动遵守适用法律和第三方合法权益,自行取得依法需要的授权。上述内容为合规提醒,不构成附加许可条件。
|
|
130
|
+
|
|
131
|
+
除适用法律另有规定或另有书面约定外,本软件按“原样”提供;保证排除与责任限制以许可证第 7、8 条为准。提供本项目不代表原作者为使用者的二次开发和运营活动背书,也不当然承担其对第三方作出的合同承诺。本说明不排除依法不得排除的责任。
|
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"}
|
|
@@ -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-14
|
|
4
|
-
|
|
5
|
-
审查对象:`@fast-china/eslint-config` 2.1.9 工作区
|
|
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` 仍不在支持范围。
|