@fast-china/eslint-config 2.0.9 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/CONTRIBUTING.md +8 -7
  3. package/README.md +108 -236
  4. package/README.zh.md +105 -231
  5. package/SECURITY.md +4 -4
  6. package/dist/configs/angular.d.mts +6 -6
  7. package/dist/configs/angular.mjs +1 -1
  8. package/dist/configs/angular.mjs.map +1 -1
  9. package/dist/configs/common.d.mts +2 -1
  10. package/dist/configs/common.mjs.map +1 -1
  11. package/dist/configs/environment.d.mts +21 -11
  12. package/dist/configs/environment.mjs +25 -5
  13. package/dist/configs/environment.mjs.map +1 -1
  14. package/dist/configs/ignores.d.mts +3 -2
  15. package/dist/configs/ignores.mjs +4 -3
  16. package/dist/configs/ignores.mjs.map +1 -1
  17. package/dist/configs/import.d.mts +2 -1
  18. package/dist/configs/import.mjs.map +1 -1
  19. package/dist/configs/index.d.mts +5 -4
  20. package/dist/configs/index.mjs +3 -2
  21. package/dist/configs/javascript.d.mts +2 -1
  22. package/dist/configs/javascript.mjs.map +1 -1
  23. package/dist/configs/json.d.mts +5 -3
  24. package/dist/configs/json.mjs +5 -4
  25. package/dist/configs/json.mjs.map +1 -1
  26. package/dist/configs/lodash.d.mts +2 -1
  27. package/dist/configs/lodash.mjs.map +1 -1
  28. package/dist/configs/markdown.d.mts +2 -1
  29. package/dist/configs/markdown.mjs.map +1 -1
  30. package/dist/configs/prettier.d.mts +2 -1
  31. package/dist/configs/prettier.mjs +4 -1
  32. package/dist/configs/prettier.mjs.map +1 -1
  33. package/dist/configs/react.d.mts +7 -44
  34. package/dist/configs/react.mjs +7 -8
  35. package/dist/configs/react.mjs.map +1 -1
  36. package/dist/configs/regexp.d.mts +4 -4
  37. package/dist/configs/regexp.mjs +5 -4
  38. package/dist/configs/regexp.mjs.map +1 -1
  39. package/dist/configs/sort-package.d.mts +4 -3
  40. package/dist/configs/sort-package.mjs +2 -2
  41. package/dist/configs/sort-package.mjs.map +1 -1
  42. package/dist/configs/sort-tsconfig.d.mts +4 -2
  43. package/dist/configs/sort-tsconfig.mjs +2 -1
  44. package/dist/configs/sort-tsconfig.mjs.map +1 -1
  45. package/dist/configs/typescript.d.mts +9 -56
  46. package/dist/configs/typescript.mjs +20 -29
  47. package/dist/configs/typescript.mjs.map +1 -1
  48. package/dist/configs/uniapp.d.mts +17 -0
  49. package/dist/configs/uniapp.mjs +30 -0
  50. package/dist/configs/uniapp.mjs.map +1 -0
  51. package/dist/configs/vue.d.mts +5 -38
  52. package/dist/configs/vue.mjs +25 -35
  53. package/dist/configs/vue.mjs.map +1 -1
  54. package/dist/constants/index.d.mts +33 -1
  55. package/dist/constants/index.mjs +33 -1
  56. package/dist/constants/index.mjs.map +1 -1
  57. package/dist/index.d.mts +41 -208
  58. package/dist/index.mjs +58 -100
  59. package/dist/index.mjs.map +1 -1
  60. package/dist/rules/angular.d.mts +1 -1
  61. package/dist/rules/angular.mjs +1 -1
  62. package/dist/rules/angular.mjs.map +1 -1
  63. package/dist/rules/common.d.mts +2 -2
  64. package/dist/rules/common.mjs +2 -2
  65. package/dist/rules/common.mjs.map +1 -1
  66. package/dist/rules/import.mjs.map +1 -1
  67. package/dist/rules/index.d.mts +2 -1
  68. package/dist/rules/index.mjs +2 -1
  69. package/dist/rules/javascript.d.mts +10 -6
  70. package/dist/rules/javascript.mjs +12 -6
  71. package/dist/rules/javascript.mjs.map +1 -1
  72. package/dist/rules/react.d.mts +2 -3
  73. package/dist/rules/react.mjs +2 -3
  74. package/dist/rules/react.mjs.map +1 -1
  75. package/dist/rules/regexp.d.mts +38 -0
  76. package/dist/rules/regexp.mjs +39 -0
  77. package/dist/rules/regexp.mjs.map +1 -0
  78. package/dist/rules/sort-package.d.mts +1 -1
  79. package/dist/rules/sort-package.mjs +1 -1
  80. package/dist/rules/sort-package.mjs.map +1 -1
  81. package/dist/rules/sort-tsconfig.d.mts +1 -1
  82. package/dist/rules/sort-tsconfig.mjs +1 -1
  83. package/dist/rules/sort-tsconfig.mjs.map +1 -1
  84. package/dist/rules/typescript.d.mts +11 -3
  85. package/dist/rules/typescript.mjs +10 -4
  86. package/dist/rules/typescript.mjs.map +1 -1
  87. package/dist/rules/vue.d.mts +8 -2
  88. package/dist/rules/vue.mjs +8 -2
  89. package/dist/rules/vue.mjs.map +1 -1
  90. package/docs/engineering-audit.zh.md +53 -77
  91. package/docs/rules-risk.md +104 -101
  92. package/docs/rules-risk.zh.md +104 -105
  93. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"sort-package.mjs","names":[],"sources":["../../src/configs/sort-package.ts"],"sourcesContent":["import { defineConfig } from \"eslint/config\";\nimport { packageJsonSortRules } from \"../rules\";\n\n/**\n * 创建 package.json 排序配置。\n *\n * @remarks\n * 该能力会产生较大的可修复 diff,因此必须显式启用;规则不会进入顺序具有\n * 条件导出语义的 `exports` 对象内部。\n *\n * @returns 仅匹配 `package.json` 的字段排序 Flat Config 数组。\n */\nexport const createPackageJsonSortConfigs = () =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/sort/package-json\",\n\t\t\tfiles: [\"**/package.json\"],\n\t\t\trules: packageJsonSortRules,\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,qCACZ,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,iBAAiB;CACzB,OAAO;AACR,CACD,CAAC"}
1
+ {"version":3,"file":"sort-package.mjs","names":[],"sources":["../../src/configs/sort-package.ts"],"sourcesContent":["import { defineConfig } from \"eslint/config\";\nimport { packageJsonSortRules } from \"../rules\";\n\n/**\n * 创建 package.json 排序配置。\n *\n * @remarks\n * 固定项目组合默认启用该能力。首次修复可能产生较大的排序 diff;规则不会进入顺序\n * 具有条件导出语义的 `exports` 对象内部。\n *\n * @returns 仅匹配 `package.json` 的字段排序 Flat Config 数组。\n */\nexport const createPackageJsonSortConfigs = (): ReturnType<typeof defineConfig> =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/sort/package-json\",\n\t\t\tfiles: [\"**/package.json\"],\n\t\t\trules: packageJsonSortRules,\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,qCACZ,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,iBAAiB;CACzB,OAAO;AACR,CACD,CAAC"}
@@ -1,13 +1,15 @@
1
+ import { defineConfig } from "eslint/config";
1
2
  //#region src/configs/sort-tsconfig.d.ts
2
3
  /**
3
4
  * 创建 tsconfig.json 排序配置。
4
5
  *
5
6
  * @remarks
6
- * 排序只改变字段阅读顺序,不改变编译选项值;由于首次修复 diff 较大,默认关闭。
7
+ * 排序只改变字段阅读顺序,不改变编译选项值。固定项目组合默认启用,首次修复可能产生
8
+ * 较大的排序 diff。
7
9
  *
8
10
  * @returns 匹配 `tsconfig.json` 与 `tsconfig.*.json` 的字段排序 Flat Config 数组。
9
11
  */
10
- declare const createTsconfigSortConfigs: () => import("eslint/config").ConfigObject[];
12
+ declare const createTsconfigSortConfigs: () => ReturnType<typeof defineConfig>;
11
13
  //#endregion
12
14
  export { createTsconfigSortConfigs };
13
15
  //# sourceMappingURL=sort-tsconfig.d.mts.map
@@ -6,7 +6,8 @@ import { defineConfig } from "eslint/config";
6
6
  * 创建 tsconfig.json 排序配置。
7
7
  *
8
8
  * @remarks
9
- * 排序只改变字段阅读顺序,不改变编译选项值;由于首次修复 diff 较大,默认关闭。
9
+ * 排序只改变字段阅读顺序,不改变编译选项值。固定项目组合默认启用,首次修复可能产生
10
+ * 较大的排序 diff。
10
11
  *
11
12
  * @returns 匹配 `tsconfig.json` 与 `tsconfig.*.json` 的字段排序 Flat Config 数组。
12
13
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sort-tsconfig.mjs","names":[],"sources":["../../src/configs/sort-tsconfig.ts"],"sourcesContent":["import { defineConfig } from \"eslint/config\";\nimport { GLOBS_TSCONFIG } from \"../constants\";\nimport { tsconfigJsonSortRules } from \"../rules\";\n\n/**\n * 创建 tsconfig.json 排序配置。\n *\n * @remarks\n * 排序只改变字段阅读顺序,不改变编译选项值;由于首次修复 diff 较大,默认关闭。\n *\n * @returns 匹配 `tsconfig.json` 与 `tsconfig.*.json` 的字段排序 Flat Config 数组。\n */\nexport const createTsconfigSortConfigs = () =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/sort/tsconfig\",\n\t\t\tfiles: [...GLOBS_TSCONFIG],\n\t\t\trules: tsconfigJsonSortRules,\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,kCACZ,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,GAAG,cAAc;CACzB,OAAO;AACR,CACD,CAAC"}
1
+ {"version":3,"file":"sort-tsconfig.mjs","names":[],"sources":["../../src/configs/sort-tsconfig.ts"],"sourcesContent":["import { defineConfig } from \"eslint/config\";\nimport { GLOBS_TSCONFIG } from \"../constants\";\nimport { tsconfigJsonSortRules } from \"../rules\";\n\n/**\n * 创建 tsconfig.json 排序配置。\n *\n * @remarks\n * 排序只改变字段阅读顺序,不改变编译选项值。固定项目组合默认启用,首次修复可能产生\n * 较大的排序 diff。\n *\n * @returns 匹配 `tsconfig.json` 与 `tsconfig.*.json` 的字段排序 Flat Config 数组。\n */\nexport const createTsconfigSortConfigs = (): ReturnType<typeof defineConfig> =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/sort/tsconfig\",\n\t\t\tfiles: [...GLOBS_TSCONFIG],\n\t\t\trules: tsconfigJsonSortRules,\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;;;AAaA,MAAa,kCACZ,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,GAAG,cAAc;CACzB,OAAO;AACR,CACD,CAAC"}
@@ -1,76 +1,29 @@
1
+ import { defineConfig } from "eslint/config";
1
2
  import { Linter } from "eslint";
2
3
  //#region src/configs/typescript.d.ts
3
- /**
4
- * TypeScript 解析器、推荐预置与类型感知检查选项。
5
- *
6
- * @remarks
7
- * 该对象通过 `fastConfig({ typescript: { ... } })` 传入。传入对象会启用 TypeScript
8
- * 支持,并检查 `.ts`、`.cts`、`.mts` 与 `.tsx`。相同的类型感知状态还会传递给已启用的
9
- * Vue 和 React 配置,使普通 TypeScript 文件、Vue SFC 与 TSX 使用一致的检查级别。
10
- *
11
- * 默认模式不读取类型信息,启动快且不要求文件属于某个 tsconfig;类型感知模式会启动
12
- * typescript-eslint Project Service,能够执行更强的语义规则,但要求项目配置和执行目录
13
- * 正确,并会增加首次检查时间与内存占用。
14
- */
15
- interface TypeScriptConfigOptions {
16
- /**
17
- * 是否启用依赖完整 TypeScript 类型信息的规则。
18
- *
19
- * `false` 使用 typescript-eslint 的 `recommended` 与 `stylistic` 预置,不创建 TypeScript
20
- * Program。`true` 切换到 `recommendedTypeChecked` 与 `stylisticTypeChecked`,并启用
21
- * `parserOptions.projectService`。被检查文件通常需要包含在可发现的 tsconfig 中,否则
22
- * Project Service 会报告文件不属于项目。
23
- *
24
- * 开启后 Vue 与 React 的 TypeScript 规则也会选择类型感知版本。大型 monorepo 建议评估
25
- * lint 启动耗时和内存占用,并确保各工作区 tsconfig 边界明确。
26
- * @defaultValue `false`
27
- */
28
- typeChecked?: boolean;
29
- /**
30
- * typescript-eslint 查找 tsconfig 与创建 Project Service 时使用的根目录。
31
- *
32
- * 仅在 `typeChecked: true` 时写入解析器选项。普通单仓库通常可让 typescript-eslint 从
33
- * `eslint.config.*` 调用栈推断;复杂 monorepo、共享配置包装层或从其他目录启动 ESLint
34
- * 时,建议传入配置文件所在目录的绝对路径,例如 `import.meta.dirname`,避免发现错误的
35
- * tsconfig 或跨越预期的项目边界。
36
- * @defaultValue `undefined`
37
- */
38
- tsconfigRootDir?: string;
39
- }
40
4
  /**
41
5
  * 返回 typescript-eslint 推荐预置。
42
6
  *
43
- * @remarks
44
- * Vue SFC 需要移除上游仅匹配 `.ts` 的文件范围,否则这些关闭核心规则的配置会与
45
- * `.vue` 外层范围形成不可能命中的 AND 条件。
46
- *
47
- * @param typeChecked - 是否选择依赖完整类型信息的推荐与风格预置。
48
- * @param removeFileScopes - 是否从每个上游预置中移除 `files` 范围。
49
- * @returns 新的预置数组;移除范围时会复制各配置对象,不修改 typescript-eslint 的导出。
7
+ * @returns ESLint 核心推荐规则与对应的 typescript-eslint 推荐预置。
50
8
  */
51
- declare const getTypeScriptPresetConfigs: (typeChecked: boolean, removeFileScopes?: boolean) => Linter.Config[];
9
+ declare const getTypeScriptPresetConfigs: () => Linter.Config[];
52
10
  /**
53
11
  * 创建 TypeScript 解析器的 Project Service 选项。
54
12
  *
55
- * @param options - 类型感知开关及可选的 tsconfig 查找根目录。
56
- * @returns 未启用类型感知时返回空对象;启用时返回 `projectService` 及可选的 `tsconfigRootDir`。
13
+ * @returns 始终启用 `projectService` 的解析器选项。
57
14
  */
58
- declare const createTypeScriptParserOptions: ({ typeChecked, tsconfigRootDir }?: TypeScriptConfigOptions) => {
59
- tsconfigRootDir?: string | undefined;
60
- projectService?: boolean | undefined;
61
- };
15
+ declare const createTypeScriptParserOptions: () => Linter.ParserOptions;
62
16
  /**
63
17
  * 创建 TypeScript 配置。
64
18
  *
65
19
  * @remarks
66
- * 默认采用无需类型信息的 recommended + stylistic 预置;`typeChecked: true` 会切换为
67
- * 对应的类型感知预置并启动 Project Service。
20
+ * 始终采用 ESLint typescript-eslint `recommendedTypeChecked` 预置并启动 Project Service。
21
+ * 被检查文件必须属于可发现的 tsconfig。特殊项目可在后置 Flat Config 中覆盖解析器选项。
68
22
  *
69
- * @param options - TypeScript 类型感知与 tsconfig 根目录选项。
70
23
  * @param files - 应用 TypeScript 配置的 ESLint glob 列表。
71
24
  * @returns 包含 TypeScript 预置、解析器选项与本地规则的 Flat Config 数组。
72
25
  */
73
- declare const createTypeScriptConfigs: (options?: TypeScriptConfigOptions, files?: readonly string[]) => import("eslint/config").ConfigObject[];
26
+ declare const createTypeScriptConfigs: (files?: readonly string[]) => ReturnType<typeof defineConfig>;
74
27
  //#endregion
75
- export { TypeScriptConfigOptions, createTypeScriptConfigs, createTypeScriptParserOptions, getTypeScriptPresetConfigs };
28
+ export { createTypeScriptConfigs, createTypeScriptParserOptions, getTypeScriptPresetConfigs };
76
29
  //# sourceMappingURL=typescript.d.mts.map
@@ -1,59 +1,50 @@
1
1
  import { GLOBS_TYPESCRIPT } from "../constants/index.mjs";
2
+ import { javascriptRules } from "../rules/javascript.mjs";
2
3
  import { typescriptRules, typescriptTypeCheckedRules } from "../rules/typescript.mjs";
3
4
  import { defineConfig } from "eslint/config";
5
+ import eslint from "@eslint/js";
4
6
  import tseslint from "typescript-eslint";
5
7
  //#region src/configs/typescript.ts
6
8
  /**
7
9
  * 返回 typescript-eslint 推荐预置。
8
10
  *
9
- * @remarks
10
- * Vue SFC 需要移除上游仅匹配 `.ts` 的文件范围,否则这些关闭核心规则的配置会与
11
- * `.vue` 外层范围形成不可能命中的 AND 条件。
12
- *
13
- * @param typeChecked - 是否选择依赖完整类型信息的推荐与风格预置。
14
- * @param removeFileScopes - 是否从每个上游预置中移除 `files` 范围。
15
- * @returns 新的预置数组;移除范围时会复制各配置对象,不修改 typescript-eslint 的导出。
11
+ * @returns ESLint 核心推荐规则与对应的 typescript-eslint 推荐预置。
16
12
  */
17
- const getTypeScriptPresetConfigs = (typeChecked, removeFileScopes = false) => {
18
- const configs = [...typeChecked ? tseslint.configs.recommendedTypeChecked : tseslint.configs.recommended, ...typeChecked ? tseslint.configs.stylisticTypeChecked : tseslint.configs.stylistic];
19
- if (!removeFileScopes) return configs;
20
- return configs.map((config) => {
21
- const { files: _files, ...configWithoutFiles } = config;
22
- return configWithoutFiles;
23
- });
24
- };
13
+ const getTypeScriptPresetConfigs = () => [
14
+ eslint.configs.recommended,
15
+ {
16
+ name: "@fast-china/typescript/javascript-rules",
17
+ rules: javascriptRules
18
+ },
19
+ ...tseslint.configs.recommendedTypeChecked
20
+ ];
25
21
  /**
26
22
  * 创建 TypeScript 解析器的 Project Service 选项。
27
23
  *
28
- * @param options - 类型感知开关及可选的 tsconfig 查找根目录。
29
- * @returns 未启用类型感知时返回空对象;启用时返回 `projectService` 及可选的 `tsconfigRootDir`。
24
+ * @returns 始终启用 `projectService` 的解析器选项。
30
25
  */
31
- const createTypeScriptParserOptions = ({ typeChecked = false, tsconfigRootDir } = {}) => ({
32
- ...typeChecked ? { projectService: true } : {},
33
- ...typeChecked && tsconfigRootDir ? { tsconfigRootDir } : {}
34
- });
26
+ const createTypeScriptParserOptions = () => ({ projectService: true });
35
27
  /**
36
28
  * 创建 TypeScript 配置。
37
29
  *
38
30
  * @remarks
39
- * 默认采用无需类型信息的 recommended + stylistic 预置;`typeChecked: true` 会切换为
40
- * 对应的类型感知预置并启动 Project Service。
31
+ * 始终采用 ESLint typescript-eslint `recommendedTypeChecked` 预置并启动 Project Service。
32
+ * 被检查文件必须属于可发现的 tsconfig。特殊项目可在后置 Flat Config 中覆盖解析器选项。
41
33
  *
42
- * @param options - TypeScript 类型感知与 tsconfig 根目录选项。
43
34
  * @param files - 应用 TypeScript 配置的 ESLint glob 列表。
44
35
  * @returns 包含 TypeScript 预置、解析器选项与本地规则的 Flat Config 数组。
45
36
  */
46
- const createTypeScriptConfigs = (options = {}, files = GLOBS_TYPESCRIPT) => defineConfig([{
47
- name: options.typeChecked ? "@fast-china/typescript/type-checked" : "@fast-china/typescript",
37
+ const createTypeScriptConfigs = (files = GLOBS_TYPESCRIPT) => defineConfig([{
38
+ name: "@fast-china/typescript/type-checked",
48
39
  files: [...files],
49
- extends: getTypeScriptPresetConfigs(options.typeChecked ?? false),
40
+ extends: getTypeScriptPresetConfigs(),
50
41
  languageOptions: {
51
42
  ecmaVersion: "latest",
52
- parserOptions: createTypeScriptParserOptions(options)
43
+ parserOptions: createTypeScriptParserOptions()
53
44
  },
54
45
  rules: {
55
46
  ...typescriptRules,
56
- ...options.typeChecked ? typescriptTypeCheckedRules : {}
47
+ ...typescriptTypeCheckedRules
57
48
  }
58
49
  }]);
59
50
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"typescript.mjs","names":[],"sources":["../../src/configs/typescript.ts"],"sourcesContent":["import { defineConfig } from \"eslint/config\";\nimport tseslint from \"typescript-eslint\";\nimport { GLOBS_TYPESCRIPT } from \"../constants\";\nimport { typescriptRules, typescriptTypeCheckedRules } from \"../rules\";\nimport type { Linter } from \"eslint\";\n\n/**\n * TypeScript 解析器、推荐预置与类型感知检查选项。\n *\n * @remarks\n * 该对象通过 `fastConfig({ typescript: { ... } })` 传入。传入对象会启用 TypeScript\n * 支持,并检查 `.ts`、`.cts`、`.mts` 与 `.tsx`。相同的类型感知状态还会传递给已启用的\n * Vue 和 React 配置,使普通 TypeScript 文件、Vue SFC 与 TSX 使用一致的检查级别。\n *\n * 默认模式不读取类型信息,启动快且不要求文件属于某个 tsconfig;类型感知模式会启动\n * typescript-eslint Project Service,能够执行更强的语义规则,但要求项目配置和执行目录\n * 正确,并会增加首次检查时间与内存占用。\n */\nexport interface TypeScriptConfigOptions {\n\t/**\n\t * 是否启用依赖完整 TypeScript 类型信息的规则。\n\t *\n\t * `false` 使用 typescript-eslint 的 `recommended` 与 `stylistic` 预置,不创建 TypeScript\n\t * Program。`true` 切换到 `recommendedTypeChecked` 与 `stylisticTypeChecked`,并启用\n\t * `parserOptions.projectService`。被检查文件通常需要包含在可发现的 tsconfig 中,否则\n\t * Project Service 会报告文件不属于项目。\n\t *\n\t * 开启后 Vue 与 React 的 TypeScript 规则也会选择类型感知版本。大型 monorepo 建议评估\n\t * lint 启动耗时和内存占用,并确保各工作区 tsconfig 边界明确。\n\t * @defaultValue `false`\n\t */\n\ttypeChecked?: boolean;\n\t/**\n\t * typescript-eslint 查找 tsconfig 与创建 Project Service 时使用的根目录。\n\t *\n\t * 仅在 `typeChecked: true` 时写入解析器选项。普通单仓库通常可让 typescript-eslint 从\n\t * `eslint.config.*` 调用栈推断;复杂 monorepo、共享配置包装层或从其他目录启动 ESLint\n\t * 时,建议传入配置文件所在目录的绝对路径,例如 `import.meta.dirname`,避免发现错误的\n\t * tsconfig 或跨越预期的项目边界。\n\t * @defaultValue `undefined`\n\t */\n\ttsconfigRootDir?: string;\n}\n\n/**\n * 返回 typescript-eslint 推荐预置。\n *\n * @remarks\n * Vue SFC 需要移除上游仅匹配 `.ts` 的文件范围,否则这些关闭核心规则的配置会与\n * `.vue` 外层范围形成不可能命中的 AND 条件。\n *\n * @param typeChecked - 是否选择依赖完整类型信息的推荐与风格预置。\n * @param removeFileScopes - 是否从每个上游预置中移除 `files` 范围。\n * @returns 新的预置数组;移除范围时会复制各配置对象,不修改 typescript-eslint 的导出。\n */\nexport const getTypeScriptPresetConfigs = (typeChecked: boolean, removeFileScopes = false): Linter.Config[] => {\n\tconst configs = [\n\t\t...(typeChecked ? tseslint.configs.recommendedTypeChecked : tseslint.configs.recommended),\n\t\t...(typeChecked ? tseslint.configs.stylisticTypeChecked : tseslint.configs.stylistic),\n\t] as Linter.Config[];\n\n\tif (!removeFileScopes) return configs;\n\n\treturn configs.map((config) => {\n\t\tconst { files: _files, ...configWithoutFiles } = config;\n\t\treturn configWithoutFiles;\n\t});\n};\n\n/**\n * 创建 TypeScript 解析器的 Project Service 选项。\n *\n * @param options - 类型感知开关及可选的 tsconfig 查找根目录。\n * @returns 未启用类型感知时返回空对象;启用时返回 `projectService` 及可选的 `tsconfigRootDir`。\n */\nexport const createTypeScriptParserOptions = ({ typeChecked = false, tsconfigRootDir }: TypeScriptConfigOptions = {}) => ({\n\t...(typeChecked ? { projectService: true } : {}),\n\t...(typeChecked && tsconfigRootDir ? { tsconfigRootDir } : {}),\n});\n\n/**\n * 创建 TypeScript 配置。\n *\n * @remarks\n * 默认采用无需类型信息的 recommended + stylistic 预置;`typeChecked: true` 会切换为\n * 对应的类型感知预置并启动 Project Service。\n *\n * @param options - TypeScript 类型感知与 tsconfig 根目录选项。\n * @param files - 应用 TypeScript 配置的 ESLint glob 列表。\n * @returns 包含 TypeScript 预置、解析器选项与本地规则的 Flat Config 数组。\n */\nexport const createTypeScriptConfigs = (options: TypeScriptConfigOptions = {}, files: readonly string[] = GLOBS_TYPESCRIPT) =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: options.typeChecked ? \"@fast-china/typescript/type-checked\" : \"@fast-china/typescript\",\n\t\t\tfiles: [...files],\n\t\t\textends: getTypeScriptPresetConfigs(options.typeChecked ?? false),\n\t\t\tlanguageOptions: {\n\t\t\t\tecmaVersion: \"latest\",\n\t\t\t\tparserOptions: createTypeScriptParserOptions(options),\n\t\t\t},\n\t\t\trules: {\n\t\t\t\t...typescriptRules,\n\t\t\t\t...(options.typeChecked ? typescriptTypeCheckedRules : {}),\n\t\t\t},\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;;;;;;AAuDA,MAAa,8BAA8B,aAAsB,mBAAmB,UAA2B;CAC9G,MAAM,UAAU,CACf,GAAI,cAAc,SAAS,QAAQ,yBAAyB,SAAS,QAAQ,aAC7E,GAAI,cAAc,SAAS,QAAQ,uBAAuB,SAAS,QAAQ,SAC5E;CAEA,IAAI,CAAC,kBAAkB,OAAO;CAE9B,OAAO,QAAQ,KAAK,WAAW;EAC9B,MAAM,EAAE,OAAO,QAAQ,GAAG,uBAAuB;EACjD,OAAO;CACR,CAAC;AACF;;;;;;;AAQA,MAAa,iCAAiC,EAAE,cAAc,OAAO,oBAA6C,CAAC,OAAO;CACzH,GAAI,cAAc,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC9C,GAAI,eAAe,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAC7D;;;;;;;;;;;;AAaA,MAAa,2BAA2B,UAAmC,CAAC,GAAG,QAA2B,qBACzG,aAAa,CACZ;CACC,MAAM,QAAQ,cAAc,wCAAwC;CACpE,OAAO,CAAC,GAAG,KAAK;CAChB,SAAS,2BAA2B,QAAQ,eAAe,KAAK;CAChE,iBAAiB;EAChB,aAAa;EACb,eAAe,8BAA8B,OAAO;CACrD;CACA,OAAO;EACN,GAAG;EACH,GAAI,QAAQ,cAAc,6BAA6B,CAAC;CACzD;AACD,CACD,CAAC"}
1
+ {"version":3,"file":"typescript.mjs","names":[],"sources":["../../src/configs/typescript.ts"],"sourcesContent":["import eslint from \"@eslint/js\";\nimport { defineConfig } from \"eslint/config\";\nimport tseslint from \"typescript-eslint\";\nimport { GLOBS_TYPESCRIPT } from \"../constants\";\nimport { javascriptRules, typescriptRules, typescriptTypeCheckedRules } from \"../rules\";\nimport type { Linter } from \"eslint\";\n\n/**\n * 返回 typescript-eslint 推荐预置。\n *\n * @returns ESLint 核心推荐规则与对应的 typescript-eslint 推荐预置。\n */\nexport const getTypeScriptPresetConfigs = (): Linter.Config[] =>\n\t[\n\t\teslint.configs.recommended,\n\t\t{\n\t\t\tname: \"@fast-china/typescript/javascript-rules\",\n\t\t\trules: javascriptRules,\n\t\t},\n\t\t...tseslint.configs.recommendedTypeChecked,\n\t] as Linter.Config[];\n\n/**\n * 创建 TypeScript 解析器的 Project Service 选项。\n *\n * @returns 始终启用 `projectService` 的解析器选项。\n */\nexport const createTypeScriptParserOptions = (): Linter.ParserOptions => ({ projectService: true });\n\n/**\n * 创建 TypeScript 配置。\n *\n * @remarks\n * 始终采用 ESLint typescript-eslint `recommendedTypeChecked` 预置并启动 Project Service。\n * 被检查文件必须属于可发现的 tsconfig。特殊项目可在后置 Flat Config 中覆盖解析器选项。\n *\n * @param files - 应用 TypeScript 配置的 ESLint glob 列表。\n * @returns 包含 TypeScript 预置、解析器选项与本地规则的 Flat Config 数组。\n */\nexport const createTypeScriptConfigs = (files: readonly string[] = GLOBS_TYPESCRIPT): ReturnType<typeof defineConfig> =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/typescript/type-checked\",\n\t\t\tfiles: [...files],\n\t\t\textends: getTypeScriptPresetConfigs(),\n\t\t\tlanguageOptions: {\n\t\t\t\tecmaVersion: \"latest\",\n\t\t\t\tparserOptions: createTypeScriptParserOptions(),\n\t\t\t},\n\t\t\trules: {\n\t\t\t\t...typescriptRules,\n\t\t\t\t...typescriptTypeCheckedRules,\n\t\t\t},\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,mCACZ;CACC,OAAO,QAAQ;CACf;EACC,MAAM;EACN,OAAO;CACR;CACA,GAAG,SAAS,QAAQ;AACrB;;;;;;AAOD,MAAa,uCAA6D,EAAE,gBAAgB,KAAK;;;;;;;;;;;AAYjG,MAAa,2BAA2B,QAA2B,qBAClE,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,GAAG,KAAK;CAChB,SAAS,2BAA2B;CACpC,iBAAiB;EAChB,aAAa;EACb,eAAe,8BAA8B;CAC9C;CACA,OAAO;EACN,GAAG;EACH,GAAG;CACJ;AACD,CACD,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { defineConfig } from "eslint/config";
2
+ //#region src/configs/uniapp.d.ts
3
+ /**
4
+ * 创建 UniApp 跨端运行时与项目清单适配。
5
+ *
6
+ * @remarks
7
+ * 除跨端公共 API 外,也声明条件编译分支常用的 `wx`、`plus`、`my`、`tt` 等平台对象。
8
+ * ESLint 不执行 UniApp 预处理器,因此这些对象在整个 UniApp 文件内可见;该配置不会验证
9
+ * 对象是否位于正确的 `#ifdef` 分支中。`.nvue` 的解析由 Vue 配置负责。
10
+ *
11
+ * @param files - 应用 UniApp 公共全局变量的代码文件 glob。
12
+ * @returns UniApp globals 与 JSON 注释兼容配置。
13
+ */
14
+ declare const createUniAppConfigs: (files?: readonly string[]) => ReturnType<typeof defineConfig>;
15
+ //#endregion
16
+ export { createUniAppConfigs };
17
+ //# sourceMappingURL=uniapp.d.mts.map
@@ -0,0 +1,30 @@
1
+ import { GLOBS_CODE, GLOBS_UNIAPP_JSON, UNIAPP_CONDITIONAL_GLOBALS, UNIAPP_GLOBALS } from "../constants/index.mjs";
2
+ import { defineConfig } from "eslint/config";
3
+ //#region src/configs/uniapp.ts
4
+ /**
5
+ * 创建 UniApp 跨端运行时与项目清单适配。
6
+ *
7
+ * @remarks
8
+ * 除跨端公共 API 外,也声明条件编译分支常用的 `wx`、`plus`、`my`、`tt` 等平台对象。
9
+ * ESLint 不执行 UniApp 预处理器,因此这些对象在整个 UniApp 文件内可见;该配置不会验证
10
+ * 对象是否位于正确的 `#ifdef` 分支中。`.nvue` 的解析由 Vue 配置负责。
11
+ *
12
+ * @param files - 应用 UniApp 公共全局变量的代码文件 glob。
13
+ * @returns UniApp globals 与 JSON 注释兼容配置。
14
+ */
15
+ const createUniAppConfigs = (files = GLOBS_CODE) => defineConfig([{
16
+ name: "@fast-china/uniapp/globals",
17
+ files: [...files],
18
+ languageOptions: { globals: {
19
+ ...UNIAPP_GLOBALS,
20
+ ...UNIAPP_CONDITIONAL_GLOBALS
21
+ } }
22
+ }, {
23
+ name: "@fast-china/uniapp/json",
24
+ files: [...GLOBS_UNIAPP_JSON],
25
+ rules: { "jsonc/no-comments": "off" }
26
+ }]);
27
+ //#endregion
28
+ export { createUniAppConfigs };
29
+
30
+ //# sourceMappingURL=uniapp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniapp.mjs","names":[],"sources":["../../src/configs/uniapp.ts"],"sourcesContent":["import { defineConfig } from \"eslint/config\";\nimport { GLOBS_CODE, GLOBS_UNIAPP_JSON, UNIAPP_CONDITIONAL_GLOBALS, UNIAPP_GLOBALS } from \"../constants\";\n\n/**\n * 创建 UniApp 跨端运行时与项目清单适配。\n *\n * @remarks\n * 除跨端公共 API 外,也声明条件编译分支常用的 `wx`、`plus`、`my`、`tt` 等平台对象。\n * ESLint 不执行 UniApp 预处理器,因此这些对象在整个 UniApp 文件内可见;该配置不会验证\n * 对象是否位于正确的 `#ifdef` 分支中。`.nvue` 的解析由 Vue 配置负责。\n *\n * @param files - 应用 UniApp 公共全局变量的代码文件 glob。\n * @returns UniApp globals 与 JSON 注释兼容配置。\n */\nexport const createUniAppConfigs = (files: readonly string[] = GLOBS_CODE): ReturnType<typeof defineConfig> =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/uniapp/globals\",\n\t\t\tfiles: [...files],\n\t\t\tlanguageOptions: {\n\t\t\t\tglobals: {\n\t\t\t\t\t...UNIAPP_GLOBALS,\n\t\t\t\t\t...UNIAPP_CONDITIONAL_GLOBALS,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"@fast-china/uniapp/json\",\n\t\t\tfiles: [...GLOBS_UNIAPP_JSON],\n\t\t\trules: {\n\t\t\t\t// UniApp 的 pages.json 和 manifest.json 使用允许注释的 JSONC 方言。\n\t\t\t\t\"jsonc/no-comments\": \"off\",\n\t\t\t},\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAa,uBAAuB,QAA2B,eAC9D,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,GAAG,KAAK;CAChB,iBAAiB,EAChB,SAAS;EACR,GAAG;EACH,GAAG;CACJ,EACD;AACD,GACA;CACC,MAAM;CACN,OAAO,CAAC,GAAG,iBAAiB;CAC5B,OAAO,EAEN,qBAAqB,MACtB;AACD,CACD,CAAC"}
@@ -1,48 +1,15 @@
1
- import { TypeScriptConfigOptions } from "./typescript.mjs";
1
+ import { defineConfig } from "eslint/config";
2
2
  //#region src/configs/vue.d.ts
3
- /**
4
- * Vue 3 单文件组件生成器使用的脚本语言与类型感知选项。
5
- *
6
- * @remarks
7
- * `fastConfig()` 会根据顶层选项推导这些值;直接组合配置片段时可从 `./configs`
8
- * 子路径使用该接口。
9
- * 用户通过顶层 `vue` 决定是否接管 `.vue` 文件,通过顶层 `typescript` 决定 SFC 脚本
10
- * 是否启用 TypeScript 解析和类型感知能力;工厂会把两者转换为此对象。
11
- *
12
- * Vue 模板始终由 `vue-eslint-parser` 解析。启用 TypeScript 时,它再把 `<script>` 内容
13
- * 委托给 typescript-eslint parser,并复用普通 TypeScript 文件的推荐预置与解析器选项。
14
- */
15
- interface VueConfigOptions {
16
- /**
17
- * 是否使用 typescript-eslint parser 解析 SFC 的 `<script>` 与 `<script setup>` 内容。
18
- *
19
- * `true` 同时加载 TypeScript 推荐规则和本库 TypeScript 规则,并允许
20
- * `<script lang="ts">`;`false` 不注册 TypeScript 脚本解析器,只按 JavaScript 处理
21
- * SFC 脚本。该值由顶层 `FastConfigOptions.typescript` 是否关闭推导。
22
- * @defaultValue `true`
23
- */
24
- typescript?: boolean;
25
- /**
26
- * 与普通 TypeScript 文件共享的类型感知和 tsconfig 根目录选项。
27
- *
28
- * `typeChecked: true` 会让 Vue SFC 使用类型感知的 typescript-eslint 预置并启动 Project
29
- * Service;`tsconfigRootDir` 会原样传给解析器。工厂只会在顶层 TypeScript 能力启用时
30
- * 传入有效设置,避免 Vue 单独形成与普通 `.ts` 文件不一致的类型检查模式。
31
- * @defaultValue `{}`
32
- */
33
- typescriptOptions?: TypeScriptConfigOptions;
34
- }
35
3
  /**
36
4
  * 创建 Vue 3 单文件组件配置。
37
5
  *
38
6
  * @remarks
39
- * 本包只处理 Vue 3。启用 TypeScript 时,Vue 模板解析器通过 `parserOptions.parser`
40
- * 委托给 typescript-eslint;这是 Vue 官方推荐的自定义脚本解析器接入方式。
7
+ * 本包只处理 Vue 3,并默认同时接管 UniApp 原生渲染页面使用的 `.nvue`。Vue 模板解析器
8
+ * 通过 `parserOptions.parser` 委托给 typescript-eslint,统一使用类型感知检查。
41
9
  *
42
- * @param options - SFC 脚本语言以及共享的 TypeScript 类型感知选项。
43
10
  * @returns 包含 Vue 模板、脚本解析器、推荐预置与本地规则的 Flat Config 数组。
44
11
  */
45
- declare const createVueConfigs: ({ typescript, typescriptOptions }?: VueConfigOptions) => import("eslint/config").ConfigObject[];
12
+ declare const createVueConfigs: () => ReturnType<typeof defineConfig>;
46
13
  //#endregion
47
- export { VueConfigOptions, createVueConfigs };
14
+ export { createVueConfigs };
48
15
  //# sourceMappingURL=vue.d.mts.map
@@ -1,9 +1,8 @@
1
- import { GLOB_VUE } from "../constants/index.mjs";
1
+ import { GLOB_NVUE, GLOB_VUE } from "../constants/index.mjs";
2
2
  import { typescriptRules, typescriptTypeCheckedRules } from "../rules/typescript.mjs";
3
3
  import { vueRules } from "../rules/vue.mjs";
4
4
  import { createTypeScriptParserOptions, getTypeScriptPresetConfigs } from "./typescript.mjs";
5
5
  import { defineConfig } from "eslint/config";
6
- import eslint from "@eslint/js";
7
6
  import tseslint from "typescript-eslint";
8
7
  import eslintPluginVue from "eslint-plugin-vue";
9
8
  import vueEslintParser from "vue-eslint-parser";
@@ -12,43 +11,34 @@ import vueEslintParser from "vue-eslint-parser";
12
11
  * 创建 Vue 3 单文件组件配置。
13
12
  *
14
13
  * @remarks
15
- * 本包只处理 Vue 3。启用 TypeScript 时,Vue 模板解析器通过 `parserOptions.parser`
16
- * 委托给 typescript-eslint;这是 Vue 官方推荐的自定义脚本解析器接入方式。
14
+ * 本包只处理 Vue 3,并默认同时接管 UniApp 原生渲染页面使用的 `.nvue`。Vue 模板解析器
15
+ * 通过 `parserOptions.parser` 委托给 typescript-eslint,统一使用类型感知检查。
17
16
  *
18
- * @param options - SFC 脚本语言以及共享的 TypeScript 类型感知选项。
19
17
  * @returns 包含 Vue 模板、脚本解析器、推荐预置与本地规则的 Flat Config 数组。
20
18
  */
21
- const createVueConfigs = ({ typescript = true, typescriptOptions = {} } = {}) => {
22
- const typeChecked = typescriptOptions.typeChecked ?? false;
23
- const typeScriptConfigs = typescript ? getTypeScriptPresetConfigs(typeChecked, true) : [];
24
- return defineConfig([{
25
- name: typeChecked ? "@fast-china/vue/type-checked" : "@fast-china/vue",
26
- files: [GLOB_VUE],
27
- extends: [
28
- eslint.configs.recommended,
29
- ...typeScriptConfigs,
30
- ...eslintPluginVue.configs["flat/recommended"]
31
- ],
32
- languageOptions: {
33
- ecmaVersion: "latest",
34
- parser: vueEslintParser,
35
- parserOptions: {
36
- ...typescript ? {
37
- parser: tseslint.parser,
38
- extraFileExtensions: [".vue"]
39
- } : {},
40
- ecmaFeatures: { jsx: true },
41
- sourceType: "module",
42
- ...createTypeScriptParserOptions(typescriptOptions)
43
- }
44
- },
45
- rules: {
46
- ...typescript ? typescriptRules : {},
47
- ...typescript && typeChecked ? typescriptTypeCheckedRules : {},
48
- ...vueRules
19
+ const createVueConfigs = () => defineConfig([{
20
+ name: "@fast-china/vue/type-checked",
21
+ files: [GLOB_VUE, GLOB_NVUE],
22
+ extends: [...getTypeScriptPresetConfigs(), ...eslintPluginVue.configs["flat/recommended"]],
23
+ languageOptions: {
24
+ ecmaVersion: "latest",
25
+ parser: vueEslintParser,
26
+ parserOptions: {
27
+ parser: tseslint.parser,
28
+ extraFileExtensions: [".vue", ".nvue"],
29
+ ecmaFeatures: { jsx: true },
30
+ sourceType: "module",
31
+ ...createTypeScriptParserOptions()
49
32
  }
50
- }]);
51
- };
33
+ },
34
+ rules: {
35
+ ...typescriptRules,
36
+ ...typescriptTypeCheckedRules,
37
+ ...tseslint.configs.recommendedTypeChecked[1]?.rules ?? {},
38
+ "@typescript-eslint/explicit-function-return-type": "off",
39
+ ...vueRules
40
+ }
41
+ }]);
52
42
  //#endregion
53
43
  export { createVueConfigs };
54
44
 
@@ -1 +1 @@
1
- {"version":3,"file":"vue.mjs","names":[],"sources":["../../src/configs/vue.ts"],"sourcesContent":["import eslint from \"@eslint/js\";\nimport { defineConfig } from \"eslint/config\";\nimport eslintPluginVue from \"eslint-plugin-vue\";\nimport tseslint from \"typescript-eslint\";\nimport vueEslintParser from \"vue-eslint-parser\";\nimport { GLOB_VUE } from \"../constants\";\nimport { typescriptRules, typescriptTypeCheckedRules, vueRules } from \"../rules\";\nimport { type TypeScriptConfigOptions, createTypeScriptParserOptions, getTypeScriptPresetConfigs } from \"./typescript\";\n\n/**\n * Vue 3 单文件组件生成器使用的脚本语言与类型感知选项。\n *\n * @remarks\n * `fastConfig()` 会根据顶层选项推导这些值;直接组合配置片段时可从 `./configs`\n * 子路径使用该接口。\n * 用户通过顶层 `vue` 决定是否接管 `.vue` 文件,通过顶层 `typescript` 决定 SFC 脚本\n * 是否启用 TypeScript 解析和类型感知能力;工厂会把两者转换为此对象。\n *\n * Vue 模板始终由 `vue-eslint-parser` 解析。启用 TypeScript 时,它再把 `<script>` 内容\n * 委托给 typescript-eslint parser,并复用普通 TypeScript 文件的推荐预置与解析器选项。\n */\nexport interface VueConfigOptions {\n\t/**\n\t * 是否使用 typescript-eslint parser 解析 SFC 的 `<script>` 与 `<script setup>` 内容。\n\t *\n\t * `true` 同时加载 TypeScript 推荐规则和本库 TypeScript 规则,并允许\n\t * `<script lang=\"ts\">`;`false` 不注册 TypeScript 脚本解析器,只按 JavaScript 处理\n\t * SFC 脚本。该值由顶层 `FastConfigOptions.typescript` 是否关闭推导。\n\t * @defaultValue `true`\n\t */\n\ttypescript?: boolean;\n\t/**\n\t * 与普通 TypeScript 文件共享的类型感知和 tsconfig 根目录选项。\n\t *\n\t * `typeChecked: true` 会让 Vue SFC 使用类型感知的 typescript-eslint 预置并启动 Project\n\t * Service;`tsconfigRootDir` 会原样传给解析器。工厂只会在顶层 TypeScript 能力启用时\n\t * 传入有效设置,避免 Vue 单独形成与普通 `.ts` 文件不一致的类型检查模式。\n\t * @defaultValue `{}`\n\t */\n\ttypescriptOptions?: TypeScriptConfigOptions;\n}\n\n/**\n * 创建 Vue 3 单文件组件配置。\n *\n * @remarks\n * 本包只处理 Vue 3。启用 TypeScript 时,Vue 模板解析器通过 `parserOptions.parser`\n * 委托给 typescript-eslint;这是 Vue 官方推荐的自定义脚本解析器接入方式。\n *\n * @param options - SFC 脚本语言以及共享的 TypeScript 类型感知选项。\n * @returns 包含 Vue 模板、脚本解析器、推荐预置与本地规则的 Flat Config 数组。\n */\nexport const createVueConfigs = ({ typescript = true, typescriptOptions = {} }: VueConfigOptions = {}) => {\n\tconst typeChecked = typescriptOptions.typeChecked ?? false;\n\tconst typeScriptConfigs = typescript ? getTypeScriptPresetConfigs(typeChecked, true) : [];\n\n\treturn defineConfig([\n\t\t{\n\t\t\tname: typeChecked ? \"@fast-china/vue/type-checked\" : \"@fast-china/vue\",\n\t\t\tfiles: [GLOB_VUE],\n\t\t\textends: [eslint.configs.recommended, ...typeScriptConfigs, ...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\t...(typescript ? { parser: tseslint.parser, extraFileExtensions: [\".vue\"] } : {}),\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(typescriptOptions),\n\t\t\t\t},\n\t\t\t},\n\t\t\trules: {\n\t\t\t\t...(typescript ? typescriptRules : {}),\n\t\t\t\t...(typescript && typeChecked ? typescriptTypeCheckedRules : {}),\n\t\t\t\t...vueRules,\n\t\t\t},\n\t\t},\n\t]);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoDA,MAAa,oBAAoB,EAAE,aAAa,MAAM,oBAAoB,CAAC,MAAwB,CAAC,MAAM;CACzG,MAAM,cAAc,kBAAkB,eAAe;CACrD,MAAM,oBAAoB,aAAa,2BAA2B,aAAa,IAAI,IAAI,CAAC;CAExF,OAAO,aAAa,CACnB;EACC,MAAM,cAAc,iCAAiC;EACrD,OAAO,CAAC,QAAQ;EAChB,SAAS;GAAC,OAAO,QAAQ;GAAa,GAAG;GAAmB,GAAG,gBAAgB,QAAQ;EAAmB;EAC1G,iBAAiB;GAChB,aAAa;GACb,QAAQ;GACR,eAAe;IACd,GAAI,aAAa;KAAE,QAAQ,SAAS;KAAQ,qBAAqB,CAAC,MAAM;IAAE,IAAI,CAAC;IAC/E,cAAc,EACb,KAAK,KACN;IACA,YAAY;IACZ,GAAG,8BAA8B,iBAAiB;GACnD;EACD;EACA,OAAO;GACN,GAAI,aAAa,kBAAkB,CAAC;GACpC,GAAI,cAAc,cAAc,6BAA6B,CAAC;GAC9D,GAAG;EACJ;CACD,CACD,CAAC;AACF"}
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_NVUE, GLOB_VUE } from \"../constants\";\nimport { typescriptRules, typescriptTypeCheckedRules, vueRules } from \"../rules\";\nimport { createTypeScriptParserOptions, getTypeScriptPresetConfigs } from \"./typescript\";\n\n/**\n * 创建 Vue 3 单文件组件配置。\n *\n * @remarks\n * 本包只处理 Vue 3,并默认同时接管 UniApp 原生渲染页面使用的 `.nvue`。Vue 模板解析器\n * 通过 `parserOptions.parser` 委托给 typescript-eslint,统一使用类型感知检查。\n *\n * @returns 包含 Vue 模板、脚本解析器、推荐预置与本地规则的 Flat Config 数组。\n */\nexport const createVueConfigs = (): ReturnType<typeof defineConfig> =>\n\tdefineConfig([\n\t\t{\n\t\t\tname: \"@fast-china/vue/type-checked\",\n\t\t\tfiles: [GLOB_VUE, GLOB_NVUE],\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\textraFileExtensions: [\".vue\", \".nvue\"],\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(),\n\t\t\t\t},\n\t\t\t},\n\t\t\trules: {\n\t\t\t\t...typescriptRules,\n\t\t\t\t...typescriptTypeCheckedRules,\n\t\t\t\t// Vue SFC 继承的 TypeScript 预置保留自身 files 范围,因此显式关闭容易误判 TS AST 的核心规则。\n\t\t\t\t...(tseslint.configs.recommendedTypeChecked[1]?.rules ?? {}),\n\t\t\t\t// SFC 内部函数依赖上下文推断返回类型,只要求模块导出边界显式声明。\n\t\t\t\t\"@typescript-eslint/explicit-function-return-type\": \"off\",\n\t\t\t\t...vueRules,\n\t\t\t},\n\t\t},\n\t]);\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiBA,MAAa,yBACZ,aAAa,CACZ;CACC,MAAM;CACN,OAAO,CAAC,UAAU,SAAS;CAC3B,SAAS,CAAC,GAAG,2BAA2B,GAAG,GAAG,gBAAgB,QAAQ,mBAAmB;CACzF,iBAAiB;EAChB,aAAa;EACb,QAAQ;EACR,eAAe;GACd,QAAQ,SAAS;GACjB,qBAAqB,CAAC,QAAQ,OAAO;GACrC,cAAc,EACb,KAAK,KACN;GACA,YAAY;GACZ,GAAG,8BAA8B;EAClC;CACD;CACA,OAAO;EACN,GAAG;EACH,GAAG;EAEH,GAAI,SAAS,QAAQ,uBAAuB,EAAE,EAAE,SAAS,CAAC;EAE1D,oDAAoD;EACpD,GAAG;CACJ;AACD,CACD,CAAC"}
@@ -14,6 +14,8 @@ declare const GLOBS_JAVASCRIPT: readonly ["**/*.{js,cjs,mjs,jsx}"];
14
14
  declare const GLOBS_TYPESCRIPT: readonly ["**/*.{ts,cts,mts,tsx}"];
15
15
  /** Vue 3 单文件组件。 */
16
16
  declare const GLOB_VUE = "**/*.vue";
17
+ /** UniApp 原生渲染页面使用的 Vue 单文件组件。 */
18
+ declare const GLOB_NVUE = "**/*.nvue";
17
19
  /** Angular 组件、指令、服务等框架源码;Angular CLI 项目以 `.ts` 为标准源码扩展名。 */
18
20
  declare const GLOB_ANGULAR_TYPESCRIPT = "**/*.ts";
19
21
  /** Angular 外部模板;内联模板由 Angular 处理器提取后复用同一模板配置。 */
@@ -26,6 +28,36 @@ declare const GLOB_JSONC = "**/*.jsonc";
26
28
  declare const GLOB_JSON5 = "**/*.json5";
27
29
  /** Markdown 文档。 */
28
30
  declare const GLOB_MARKDOWN = "**/*.md";
31
+ /** UniApp 项目允许使用注释的应用清单和页面路由配置。 */
32
+ declare const GLOBS_UNIAPP_JSON: readonly ["**/manifest.json", "**/pages.json"];
33
+ /** UniApp 跨端运行时提供的公共全局变量。 */
34
+ declare const UNIAPP_GLOBALS: {
35
+ readonly getApp: "readonly";
36
+ readonly getCurrentPages: "readonly";
37
+ readonly getCurrentSubNVue: "readonly";
38
+ readonly uni: "readonly";
39
+ readonly uniCloud: "readonly";
40
+ };
41
+ /**
42
+ * UniApp 条件编译分支中可能由目标平台注入的全局变量。
43
+ *
44
+ * @remarks
45
+ * ESLint 不执行 `#ifdef`/`#endif` 预处理,因此启用 UniApp 后统一声明这些对象。它们只解决
46
+ * 静态 `no-undef`,不会验证当前发行目标是否真的提供对应 API。
47
+ */
48
+ declare const UNIAPP_CONDITIONAL_GLOBALS: {
49
+ readonly dd: "readonly";
50
+ readonly jd: "readonly";
51
+ readonly ks: "readonly";
52
+ readonly my: "readonly";
53
+ readonly plus: "readonly";
54
+ readonly qh: "readonly";
55
+ readonly qq: "readonly";
56
+ readonly swan: "readonly";
57
+ readonly tt: "readonly";
58
+ readonly weex: "readonly";
59
+ readonly wx: "readonly";
60
+ };
29
61
  /** 默认由 JavaScript、TypeScript 和 Vue 规则处理的全部代码文件。 */
30
62
  declare const GLOBS_CODE: readonly ["**/*.{js,cjs,mjs,jsx}", "**/*.{ts,cts,mts,tsx}", "**/*.vue"];
31
63
  /**
@@ -40,5 +72,5 @@ declare const GLOBS_TSCONFIG: readonly ["**/tsconfig.json", "**/tsconfig.*.json"
40
72
  /** 不应交给 JSON/Markdown 解析器处理的包管理器锁文件。 */
41
73
  declare const GLOBS_LOCKFILES: readonly ["**/package-lock.json", "**/yarn.lock", "**/pnpm-lock.yaml", "**/bun.lock", "**/bun.lockb", "**/deno.lock"];
42
74
  //#endregion
43
- export { GLOBS_CODE, GLOBS_JAVASCRIPT, GLOBS_LOCKFILES, GLOBS_NODE_TOOLING, GLOBS_TSCONFIG, GLOBS_TYPESCRIPT, GLOB_ANGULAR_TEMPLATE, GLOB_ANGULAR_TYPESCRIPT, GLOB_JSON, GLOB_JSON5, GLOB_JSONC, GLOB_MARKDOWN, GLOB_VUE };
75
+ 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_MARKDOWN, GLOB_NVUE, GLOB_VUE, UNIAPP_CONDITIONAL_GLOBALS, UNIAPP_GLOBALS };
44
76
  //# sourceMappingURL=index.d.mts.map
@@ -14,6 +14,8 @@ const GLOBS_JAVASCRIPT = ["**/*.{js,cjs,mjs,jsx}"];
14
14
  const GLOBS_TYPESCRIPT = ["**/*.{ts,cts,mts,tsx}"];
15
15
  /** Vue 3 单文件组件。 */
16
16
  const GLOB_VUE = "**/*.vue";
17
+ /** UniApp 原生渲染页面使用的 Vue 单文件组件。 */
18
+ const GLOB_NVUE = "**/*.nvue";
17
19
  /** Angular 组件、指令、服务等框架源码;Angular CLI 项目以 `.ts` 为标准源码扩展名。 */
18
20
  const GLOB_ANGULAR_TYPESCRIPT = "**/*.ts";
19
21
  /** Angular 外部模板;内联模板由 Angular 处理器提取后复用同一模板配置。 */
@@ -26,6 +28,36 @@ const GLOB_JSONC = "**/*.jsonc";
26
28
  const GLOB_JSON5 = "**/*.json5";
27
29
  /** Markdown 文档。 */
28
30
  const GLOB_MARKDOWN = "**/*.md";
31
+ /** UniApp 项目允许使用注释的应用清单和页面路由配置。 */
32
+ const GLOBS_UNIAPP_JSON = ["**/manifest.json", "**/pages.json"];
33
+ /** UniApp 跨端运行时提供的公共全局变量。 */
34
+ const UNIAPP_GLOBALS = {
35
+ getApp: "readonly",
36
+ getCurrentPages: "readonly",
37
+ getCurrentSubNVue: "readonly",
38
+ uni: "readonly",
39
+ uniCloud: "readonly"
40
+ };
41
+ /**
42
+ * UniApp 条件编译分支中可能由目标平台注入的全局变量。
43
+ *
44
+ * @remarks
45
+ * ESLint 不执行 `#ifdef`/`#endif` 预处理,因此启用 UniApp 后统一声明这些对象。它们只解决
46
+ * 静态 `no-undef`,不会验证当前发行目标是否真的提供对应 API。
47
+ */
48
+ const UNIAPP_CONDITIONAL_GLOBALS = {
49
+ dd: "readonly",
50
+ jd: "readonly",
51
+ ks: "readonly",
52
+ my: "readonly",
53
+ plus: "readonly",
54
+ qh: "readonly",
55
+ qq: "readonly",
56
+ swan: "readonly",
57
+ tt: "readonly",
58
+ weex: "readonly",
59
+ wx: "readonly"
60
+ };
29
61
  /** 默认由 JavaScript、TypeScript 和 Vue 规则处理的全部代码文件。 */
30
62
  const GLOBS_CODE = [
31
63
  ...GLOBS_JAVASCRIPT,
@@ -57,6 +89,6 @@ const GLOBS_LOCKFILES = [
57
89
  "**/deno.lock"
58
90
  ];
59
91
  //#endregion
60
- export { GLOBS_CODE, GLOBS_JAVASCRIPT, GLOBS_LOCKFILES, GLOBS_NODE_TOOLING, GLOBS_TSCONFIG, GLOBS_TYPESCRIPT, GLOB_ANGULAR_TEMPLATE, GLOB_ANGULAR_TYPESCRIPT, GLOB_JSON, GLOB_JSON5, GLOB_JSONC, GLOB_MARKDOWN, GLOB_VUE };
92
+ 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_MARKDOWN, GLOB_NVUE, GLOB_VUE, UNIAPP_CONDITIONAL_GLOBALS, UNIAPP_GLOBALS };
61
93
 
62
94
  //# sourceMappingURL=index.mjs.map
@@ -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/** Vue 3 单文件组件。 */\nexport const GLOB_VUE = \"**/*.vue\";\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/** 默认由 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 = [\"**/package-lock.json\", \"**/yarn.lock\", \"**/pnpm-lock.yaml\", \"**/bun.lock\", \"**/bun.lockb\", \"**/deno.lock\"] as const;\n"],"mappings":";;;;;;;;;;;AAWA,MAAa,mBAAmB,CAAC,uBAAuB;;AAGxD,MAAa,mBAAmB,CAAC,uBAAuB;;AAGxD,MAAa,WAAW;;AAGxB,MAAa,0BAA0B;;AAGvC,MAAa,wBAAwB;;AAGrC,MAAa,YAAY;;AAEzB,MAAa,aAAa;;AAE1B,MAAa,aAAa;;AAG1B,MAAa,gBAAgB;;AAG7B,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;CAAC;CAAwB;CAAgB;CAAqB;CAAe;CAAgB;AAAc"}
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/** 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 = [\"**/package-lock.json\", \"**/yarn.lock\", \"**/pnpm-lock.yaml\", \"**/bun.lock\", \"**/bun.lockb\", \"**/deno.lock\"] as const;\n"],"mappings":";;;;;;;;;;;AAWA,MAAa,mBAAmB,CAAC,uBAAuB;;AAGxD,MAAa,mBAAmB,CAAC,uBAAuB;;AAGxD,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;CAAC;CAAwB;CAAgB;CAAqB;CAAe;CAAgB;AAAc"}