@fast-china/eslint-config 2.0.8 → 2.0.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 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.0.9 - 2026-08-10
10
+
11
+ ### Changed
12
+
13
+ - Allowed type-aware TypeScript configurations to forward `unknown` Promise rejection reasons without disabling `prefer-promise-reject-errors` for statically known non-`Error` values.
14
+
9
15
  ## 2.0.8 - 2026-08-09
10
16
 
11
17
  ### Changed
@@ -1,5 +1,5 @@
1
1
  import { GLOBS_TYPESCRIPT } from "../constants/index.mjs";
2
- import { typescriptRules } from "../rules/typescript.mjs";
2
+ import { typescriptRules, typescriptTypeCheckedRules } from "../rules/typescript.mjs";
3
3
  import { defineConfig } from "eslint/config";
4
4
  import tseslint from "typescript-eslint";
5
5
  //#region src/configs/typescript.ts
@@ -51,7 +51,10 @@ const createTypeScriptConfigs = (options = {}, files = GLOBS_TYPESCRIPT) => defi
51
51
  ecmaVersion: "latest",
52
52
  parserOptions: createTypeScriptParserOptions(options)
53
53
  },
54
- rules: typescriptRules
54
+ rules: {
55
+ ...typescriptRules,
56
+ ...options.typeChecked ? typescriptTypeCheckedRules : {}
57
+ }
55
58
  }]);
56
59
  //#endregion
57
60
  export { createTypeScriptConfigs, createTypeScriptParserOptions, getTypeScriptPresetConfigs };
@@ -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 } 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: typescriptRules,\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;AACR,CACD,CAAC"}
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,5 +1,5 @@
1
1
  import { GLOB_VUE } from "../constants/index.mjs";
2
- import { typescriptRules } from "../rules/typescript.mjs";
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";
@@ -44,6 +44,7 @@ const createVueConfigs = ({ typescript = true, typescriptOptions = {} } = {}) =>
44
44
  },
45
45
  rules: {
46
46
  ...typescript ? typescriptRules : {},
47
+ ...typescript && typeChecked ? typescriptTypeCheckedRules : {},
47
48
  ...vueRules
48
49
  }
49
50
  }]);
@@ -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, 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...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,GAAG;EACJ;CACD,CACD,CAAC;AACF"}
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"}
@@ -7,6 +7,6 @@ import { preferLodashRules, preferLodashUnifiedRules } from "./lodash.mjs";
7
7
  import { reactRules } from "./react.mjs";
8
8
  import { packageJsonSortRules } from "./sort-package.mjs";
9
9
  import { tsconfigJsonSortRules } from "./sort-tsconfig.mjs";
10
- import { typescriptRules } from "./typescript.mjs";
10
+ import { typescriptRules, typescriptTypeCheckedRules } from "./typescript.mjs";
11
11
  import { vueRules } from "./vue.mjs";
12
- export { type RuleOptions, angularRules, angularTemplateAccessibilityRules, angularTemplateRules, commonRules, importRules, javascriptRules, packageJsonSortRules, preferLodashRules, preferLodashUnifiedRules, reactRules, tsconfigJsonSortRules, typescriptRules, vueRules };
12
+ export { type RuleOptions, angularRules, angularTemplateAccessibilityRules, angularTemplateRules, commonRules, importRules, javascriptRules, packageJsonSortRules, preferLodashRules, preferLodashUnifiedRules, reactRules, tsconfigJsonSortRules, typescriptRules, typescriptTypeCheckedRules, vueRules };
@@ -6,6 +6,6 @@ import { preferLodashRules, preferLodashUnifiedRules } from "./lodash.mjs";
6
6
  import { reactRules } from "./react.mjs";
7
7
  import { packageJsonSortRules } from "./sort-package.mjs";
8
8
  import { tsconfigJsonSortRules } from "./sort-tsconfig.mjs";
9
- import { typescriptRules } from "./typescript.mjs";
9
+ import { typescriptRules, typescriptTypeCheckedRules } from "./typescript.mjs";
10
10
  import { vueRules } from "./vue.mjs";
11
- export { angularRules, angularTemplateAccessibilityRules, angularTemplateRules, commonRules, importRules, javascriptRules, packageJsonSortRules, preferLodashRules, preferLodashUnifiedRules, reactRules, tsconfigJsonSortRules, typescriptRules, vueRules };
11
+ export { angularRules, angularTemplateAccessibilityRules, angularTemplateRules, commonRules, importRules, javascriptRules, packageJsonSortRules, preferLodashRules, preferLodashUnifiedRules, reactRules, tsconfigJsonSortRules, typescriptRules, typescriptTypeCheckedRules, vueRules };
@@ -31,6 +31,12 @@ declare const typescriptRules: {
31
31
  prefer: "type-imports";
32
32
  }];
33
33
  };
34
+ /** 仅在启用 Project Service 后应用的 TypeScript 类型感知规则覆写。 */
35
+ declare const typescriptTypeCheckedRules: {
36
+ "@typescript-eslint/prefer-promise-reject-errors": ["error", {
37
+ allowThrowingUnknown: true;
38
+ }];
39
+ };
34
40
  //#endregion
35
- export { typescriptRules };
41
+ export { typescriptRules, typescriptTypeCheckedRules };
36
42
  //# sourceMappingURL=typescript.d.mts.map
@@ -31,7 +31,9 @@ const typescriptRules = {
31
31
  prefer: "type-imports"
32
32
  }]
33
33
  };
34
+ /** 仅在启用 Project Service 后应用的 TypeScript 类型感知规则覆写。 */
35
+ const typescriptTypeCheckedRules = { "@typescript-eslint/prefer-promise-reject-errors": ["error", { allowThrowingUnknown: true }] };
34
36
  //#endregion
35
- export { typescriptRules };
37
+ export { typescriptRules, typescriptTypeCheckedRules };
36
38
 
37
39
  //# sourceMappingURL=typescript.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"typescript.mjs","names":[],"sources":["../../src/rules/typescript.ts"],"sourcesContent":["import type { RuleOptions } from \"../typegen\";\n\n/**\n * TypeScript 本地覆写规则。\n *\n * @remarks\n * 这里补充 typescript-eslint 预置;高影响规则需同步维护风险文档。\n */\nexport const typescriptRules = {\n\t// 使用 TypeScript 版本避免核心规则误判声明合并、类型和值的同名声明。\n\t\"@typescript-eslint/no-redeclare\": \"error\",\n\t// [高影响][可自动修复] 未使用符号视为错误;以下划线开头可显式表示参数或变量被有意忽略。\n\t\"@typescript-eslint/no-unused-vars\": [\n\t\t\"error\",\n\t\t{\n\t\t\targs: \"after-used\",\n\t\t\targsIgnorePattern: \"^_\",\n\t\t\tcaughtErrors: \"all\",\n\t\t\tcaughtErrorsIgnorePattern: \"^_\",\n\t\t\tignoreRestSiblings: true,\n\t\t\tvarsIgnorePattern: \"^_\",\n\t\t},\n\t],\n\t// [默认关闭] 声明文件、全局扩展和部分 SDK 仍需要 namespace。\n\t\"@typescript-eslint/no-namespace\": \"off\",\n\t// any 会绕过类型检查,但在第三方边界和渐进式类型完善中有合理用途,因此只警告。\n\t\"@typescript-eslint/no-explicit-any\": \"warn\",\n\t// [高影响] 默认要求 ESM import;CommonJS、动态加载或工具链互操作代码可能需要按文件关闭。\n\t\"@typescript-eslint/no-require-imports\": \"error\",\n\t// 使用 TS 版本识别类型断言等语法;允许常见的短路和三元表达式调用模式。\n\t\"@typescript-eslint/no-unused-expressions\": [\n\t\t\"error\",\n\t\t{\n\t\t\tallowShortCircuit: true,\n\t\t\tallowTernary: true,\n\t\t},\n\t],\n\t// [可自动修复] 删除可由 TypeScript 明确推断的原始值类型标注,减少重复信息。\n\t\"@typescript-eslint/no-inferrable-types\": \"error\",\n\t// 非空断言可能隐藏空值缺陷;以警告提示逐步消除,避免一次性产生大量阻断错误。\n\t\"@typescript-eslint/no-non-null-assertion\": \"warn\",\n\t// 可选链之后再做非空断言逻辑矛盾,通常表示边界条件设计有误。\n\t\"@typescript-eslint/no-non-null-asserted-optional-chain\": \"error\",\n\t// [高影响][可自动修复] 类型依赖改用内联 type import;需复核仅靠 import 触发的模块副作用。\n\t\"@typescript-eslint/consistent-type-imports\": [\n\t\t\"error\",\n\t\t{\n\t\t\tdisallowTypeAnnotations: false,\n\t\t\tfixStyle: \"inline-type-imports\",\n\t\t\tprefer: \"type-imports\",\n\t\t},\n\t],\n} satisfies RuleOptions;\n"],"mappings":";;;;;;;AAQA,MAAa,kBAAkB;CAE9B,mCAAmC;CAEnC,qCAAqC,CACpC,SACA;EACC,MAAM;EACN,mBAAmB;EACnB,cAAc;EACd,2BAA2B;EAC3B,oBAAoB;EACpB,mBAAmB;CACpB,CACD;CAEA,mCAAmC;CAEnC,sCAAsC;CAEtC,yCAAyC;CAEzC,4CAA4C,CAC3C,SACA;EACC,mBAAmB;EACnB,cAAc;CACf,CACD;CAEA,0CAA0C;CAE1C,4CAA4C;CAE5C,0DAA0D;CAE1D,8CAA8C,CAC7C,SACA;EACC,yBAAyB;EACzB,UAAU;EACV,QAAQ;CACT,CACD;AACD"}
1
+ {"version":3,"file":"typescript.mjs","names":[],"sources":["../../src/rules/typescript.ts"],"sourcesContent":["import type { RuleOptions } from \"../typegen\";\n\n/**\n * TypeScript 本地覆写规则。\n *\n * @remarks\n * 这里补充 typescript-eslint 预置;高影响规则需同步维护风险文档。\n */\nexport const typescriptRules = {\n\t// 使用 TypeScript 版本避免核心规则误判声明合并、类型和值的同名声明。\n\t\"@typescript-eslint/no-redeclare\": \"error\",\n\t// [高影响][可自动修复] 未使用符号视为错误;以下划线开头可显式表示参数或变量被有意忽略。\n\t\"@typescript-eslint/no-unused-vars\": [\n\t\t\"error\",\n\t\t{\n\t\t\targs: \"after-used\",\n\t\t\targsIgnorePattern: \"^_\",\n\t\t\tcaughtErrors: \"all\",\n\t\t\tcaughtErrorsIgnorePattern: \"^_\",\n\t\t\tignoreRestSiblings: true,\n\t\t\tvarsIgnorePattern: \"^_\",\n\t\t},\n\t],\n\t// [默认关闭] 声明文件、全局扩展和部分 SDK 仍需要 namespace。\n\t\"@typescript-eslint/no-namespace\": \"off\",\n\t// any 会绕过类型检查,但在第三方边界和渐进式类型完善中有合理用途,因此只警告。\n\t\"@typescript-eslint/no-explicit-any\": \"warn\",\n\t// [高影响] 默认要求 ESM import;CommonJS、动态加载或工具链互操作代码可能需要按文件关闭。\n\t\"@typescript-eslint/no-require-imports\": \"error\",\n\t// 使用 TS 版本识别类型断言等语法;允许常见的短路和三元表达式调用模式。\n\t\"@typescript-eslint/no-unused-expressions\": [\n\t\t\"error\",\n\t\t{\n\t\t\tallowShortCircuit: true,\n\t\t\tallowTernary: true,\n\t\t},\n\t],\n\t// [可自动修复] 删除可由 TypeScript 明确推断的原始值类型标注,减少重复信息。\n\t\"@typescript-eslint/no-inferrable-types\": \"error\",\n\t// 非空断言可能隐藏空值缺陷;以警告提示逐步消除,避免一次性产生大量阻断错误。\n\t\"@typescript-eslint/no-non-null-assertion\": \"warn\",\n\t// 可选链之后再做非空断言逻辑矛盾,通常表示边界条件设计有误。\n\t\"@typescript-eslint/no-non-null-asserted-optional-chain\": \"error\",\n\t// [高影响][可自动修复] 类型依赖改用内联 type import;需复核仅靠 import 触发的模块副作用。\n\t\"@typescript-eslint/consistent-type-imports\": [\n\t\t\"error\",\n\t\t{\n\t\t\tdisallowTypeAnnotations: false,\n\t\t\tfixStyle: \"inline-type-imports\",\n\t\t\tprefer: \"type-imports\",\n\t\t},\n\t],\n} satisfies RuleOptions;\n\n/** 仅在启用 Project Service 后应用的 TypeScript 类型感知规则覆写。 */\nexport const typescriptTypeCheckedRules = {\n\t// 允许透明转发外部 Promise 的未知拒绝原因;静态可知的 string、number 等仍会被报告。\n\t\"@typescript-eslint/prefer-promise-reject-errors\": [\"error\", { allowThrowingUnknown: true }],\n} satisfies RuleOptions;\n"],"mappings":";;;;;;;AAQA,MAAa,kBAAkB;CAE9B,mCAAmC;CAEnC,qCAAqC,CACpC,SACA;EACC,MAAM;EACN,mBAAmB;EACnB,cAAc;EACd,2BAA2B;EAC3B,oBAAoB;EACpB,mBAAmB;CACpB,CACD;CAEA,mCAAmC;CAEnC,sCAAsC;CAEtC,yCAAyC;CAEzC,4CAA4C,CAC3C,SACA;EACC,mBAAmB;EACnB,cAAc;CACf,CACD;CAEA,0CAA0C;CAE1C,4CAA4C;CAE5C,0DAA0D;CAE1D,8CAA8C,CAC7C,SACA;EACC,yBAAyB;EACzB,UAAU;EACV,QAAQ;CACT,CACD;AACD;;AAGA,MAAa,6BAA6B,EAEzC,mDAAmD,CAAC,SAAS,EAAE,sBAAsB,KAAK,CAAC,EAC5F"}
@@ -53,7 +53,7 @@ The exact upstream rule set is defined by the dependency versions in `pnpm-lock.
53
53
 
54
54
  ## High-impact features not enabled by default
55
55
 
56
- - Type-aware TypeScript and Vue presets require `typeChecked: true`. They add project-service cost and rules such as `no-floating-promises`.
56
+ - Type-aware TypeScript and Vue presets require `typeChecked: true`. They add project-service cost and rules such as `no-floating-promises`. `prefer-promise-reject-errors` permits transparent forwarding of `unknown` rejection reasons while still reporting statically known non-`Error` values such as strings and numbers.
57
57
  - React requires `react: true`. Its upstream recommended and official Hooks presets include blocking component, Hooks, and React Compiler rules; review existing custom hook and memoization patterns when adopting it.
58
58
  - Angular requires `angular: true`. The framework bundle enables `prefer-inject`, OnPush change detection, standalone components, modern template control flow, and template accessibility. These policies are intentionally not active in the default Vue configuration.
59
59
  - The `jsonc/sort-keys` and `jsonc/sort-array-values` manifest rules require `sortPackageJson: true` or `sortTsconfig: true`. Isolate the first fix and verify the publish manifest.
@@ -57,7 +57,7 @@
57
57
 
58
58
  ## 明确不默认启用的高影响能力
59
59
 
60
- - TypeScript 和 Vue 的类型感知预置仅在 `typeChecked: true` 时启用;它们会增加项目服务开销,并启用 `no-floating-promises` 等需要类型信息的规则。
60
+ - TypeScript 和 Vue 的类型感知预置仅在 `typeChecked: true` 时启用;它们会增加项目服务开销,并启用 `no-floating-promises` 等需要类型信息的规则。`prefer-promise-reject-errors` 允许透明转发 `unknown` 拒绝原因,但静态可知的 string、number 等非 `Error` 值仍会被报告。
61
61
  - React 仅在 `react: true` 时启用。其上游推荐预置和官方 Hooks 预置包含阻断级组件、Hooks 与 React Compiler 规则;接入旧项目时应重点审查自定义 Hook 和 memoization 写法。
62
62
  - Angular 仅在 `angular: true` 时启用。框架规则默认要求 `inject()`、OnPush 变更检测、独立组件、现代模板控制流和模板无障碍;这些约束不会进入默认 Vue 配置。
63
63
  - 清单排序规则 `jsonc/sort-keys`、`jsonc/sort-array-values` 分别仅在 `sortPackageJson: true`、`sortTsconfig: true` 时启用;首次修复应单独提交并核对发布清单。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fast-china/eslint-config",
3
- "version": "2.0.8",
3
+ "version": "2.0.9",
4
4
  "description": "Opinionated, typed ESLint Flat Config for Vue 3, React, Angular, Vite, TypeScript, JavaScript, and Node.js.",
5
5
  "type": "module",
6
6
  "keywords": [