@fast-china/eslint-config 1.1.0 → 2.0.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.
package/dist/index.js CHANGED
@@ -1,80 +1,43 @@
1
- import { defineConfig } from 'eslint/config';
2
- import eslintPluginJsonc from 'eslint-plugin-jsonc';
1
+ import { defineConfig, globalIgnores } from 'eslint/config';
3
2
  import globals from 'globals';
4
3
  import eslintConfigFlatGitignore from 'eslint-config-flat-gitignore';
5
4
  import eslintPluginImportX from 'eslint-plugin-import-x';
6
5
  import eslint from '@eslint/js';
6
+ import eslintPluginJsonc from 'eslint-plugin-jsonc';
7
7
  import eslintMarkdown from '@eslint/markdown';
8
8
  import eslintConfigPrettierFlat from 'eslint-config-prettier/flat';
9
9
  import eslintPluginRegexp from 'eslint-plugin-regexp';
10
- import tseslint2 from 'typescript-eslint';
10
+ import tseslint from 'typescript-eslint';
11
11
  import eslintPluginVue from 'eslint-plugin-vue';
12
12
  import vueEslintParser from 'vue-eslint-parser';
13
13
 
14
- // src/configs/json.ts
14
+ // src/define-rules.ts
15
+ var defineRules = (rules) => rules;
15
16
 
16
17
  // src/constants/index.ts
17
- var CONST_JS = "**/*.?([cm])js";
18
- var CONST_JSX = "**/*.?([cm])jsx";
19
- var CONST_TS = "**/*.?([cm])ts";
20
- var CONST_TSX = "**/*.?([cm])tsx";
21
- var CONST_DTS = "**/*.d.ts";
22
- var CONST_JSON = "**/*.json";
23
- var CONST_JSONC = "**/*.jsonc";
24
- var CONST_JSON5 = "**/*.json5";
25
- var CONST_MD = "**/*.md";
26
- var CONST_VUE = "**/*.vue";
27
- var CONST_YAML = "**/*.y?(a)ml";
28
- var CONST_NODE_MODULES = "**/node_modules/**";
29
- var CONST_DIST = "**/dist/**";
30
- var CONST_LOCKFILE = ["**/package-lock.json", "**/yarn.lock", "**/pnpm-lock.yaml", "**/bun.lock", "**/bun.lockb", "**/deno.lock"];
31
- var CONST_PUBLIC = "**/public";
32
- var CONST_TSCONFIG = ["**/tsconfig.json", "**/tsconfig.*.json"];
33
- var GLOB_JAVASCRIPT = [CONST_JS, CONST_JSX];
34
- var GLOB_TYPESCRIPT = [CONST_TS, CONST_TSX];
35
- var GLOB_CODE = [...GLOB_JAVASCRIPT, ...GLOB_TYPESCRIPT, CONST_VUE];
36
- var GLOB_NODE = [
37
- "**/*.{config,setup}.{js,cjs,mjs,ts,cts,mts}",
38
- "**/{scripts,bin}/**/*.{js,cjs,mjs,ts,cts,mts}",
39
- "**/{test,tests}/**/*.{js,cjs,mjs,ts,cts,mts}",
18
+ var GLOBS_JAVASCRIPT = ["**/*.{js,cjs,mjs,jsx}"];
19
+ var GLOBS_TYPESCRIPT = ["**/*.{ts,cts,mts,tsx}"];
20
+ var GLOB_VUE = "**/*.vue";
21
+ var GLOB_JSON = "**/*.json";
22
+ var GLOB_JSONC = "**/*.jsonc";
23
+ var GLOB_JSON5 = "**/*.json5";
24
+ var GLOB_MARKDOWN = "**/*.md";
25
+ var GLOBS_CODE = [...GLOBS_JAVASCRIPT, ...GLOBS_TYPESCRIPT, GLOB_VUE];
26
+ var GLOBS_NODE_TOOLING = [
27
+ "**/*.{config,setup}.{js,cjs,mjs,jsx,ts,cts,mts,tsx}",
28
+ "**/{scripts,bin}/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}",
29
+ "**/{test,tests}/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}",
30
+ "**/*.{test,spec}.{js,cjs,mjs,jsx,ts,cts,mts,tsx}",
40
31
  "**/cli.{js,cjs,mjs,ts,cts,mts}"
41
32
  ];
42
-
43
- // src/configs/json.ts
44
- var jsonConfigs = defineConfig([
45
- {
46
- name: "@fast-china/json/strict",
47
- files: [CONST_JSON],
48
- extends: [eslintPluginJsonc.configs["flat/recommended-with-json"]]
49
- },
50
- {
51
- name: "@fast-china/json/jsonc",
52
- files: [CONST_JSONC],
53
- extends: [eslintPluginJsonc.configs["flat/recommended-with-jsonc"]]
54
- },
55
- {
56
- name: "@fast-china/json/json5",
57
- files: [CONST_JSON5],
58
- extends: [eslintPluginJsonc.configs["flat/recommended-with-json5"]]
59
- },
60
- {
61
- name: "@fast-china/json/settings",
62
- files: ["**/.vscode/settings.json"],
63
- rules: {
64
- // 允许注释
65
- "jsonc/no-comments": "off"
66
- }
67
- }
68
- ]);
69
-
70
- // src/define-rules.ts
71
- var defineRules = (rules) => rules;
33
+ var GLOBS_TSCONFIG = ["**/tsconfig.json", "**/tsconfig.*.json"];
34
+ var GLOBS_LOCKFILES = ["**/package-lock.json", "**/yarn.lock", "**/pnpm-lock.yaml", "**/bun.lock", "**/bun.lockb", "**/deno.lock"];
72
35
 
73
36
  // src/rules/common.ts
74
37
  var commonRules = {
75
38
  // 要求数组回调在所有可到达分支返回值,避免 map/filter 等调用静默产生 undefined。
76
39
  "array-callback-return": "error",
77
- // 浏览器弹窗通常不适合生产代码,但保留为警告以兼容原型开发和已有项目。
40
+ // 浏览器弹窗通常不适合生产代码;使用 warn 允许原型调试,同时确保发布前能够被发现。
78
41
  "no-alert": "warn",
79
42
  // switch 的 case 不创建词法作用域;要求用花括号包裹声明,避免跨 case 冲突。
80
43
  "no-case-declarations": "error",
@@ -181,9 +144,9 @@ var javascriptRules = {
181
144
  checkLoops: false
182
145
  }
183
146
  ],
184
- // [高影响] 禁止标签语句;迁移包含多层循环 labeled break/continue 的代码时需先重构控制流。
147
+ // [高影响] 禁止标签语句;包含多层循环 labeled break/continue 的代码需先重构控制流。
185
148
  "no-restricted-syntax": ["error", "LabeledStatement"],
186
- // [高影响][可自动修复] 使用 let/const 替代 var;首次迁移需复核循环闭包和声明提升行为。
149
+ // [高影响][可自动修复] 使用 let/const 替代 var;首次启用需复核循环闭包和声明提升行为。
187
150
  "no-var": "error",
188
151
  // 禁止无说明的空代码块;允许用于“忽略失败”语义的空 catch。
189
152
  "no-empty": [
@@ -194,7 +157,7 @@ var javascriptRules = {
194
157
  ],
195
158
  // 拒绝肉眼难以识别、可能导致解析差异的非常规空白字符。
196
159
  "no-irregular-whitespace": "error",
197
- // 变量和类先声明后使用;函数声明允许提升。使用 warn 降低旧项目迁移阻力。
160
+ // 变量和类先声明后使用;函数声明允许提升。warn 保留函数式组合和循环依赖重构空间。
198
161
  "no-use-before-define": [
199
162
  "warn",
200
163
  {
@@ -211,7 +174,7 @@ var javascriptRules = {
211
174
  ignoreReadBeforeAssign: true
212
175
  }
213
176
  ],
214
- // [高影响][可自动修复] 优先箭头回调;批量迁移后应复核 this/arguments 与函数名栈信息。
177
+ // [高影响][可自动修复] 优先箭头回调;批量修复后应复核 this/arguments 与函数名栈信息。
215
178
  "prefer-arrow-callback": [
216
179
  "error",
217
180
  {
@@ -242,9 +205,59 @@ var javascriptRules = {
242
205
  "no-redeclare": "error"
243
206
  };
244
207
 
208
+ // src/rules/lodash.ts
209
+ var preferLodashUnifiedRules = {
210
+ // [高影响][按需启用] 禁止混用 lodash 与 lodash-es,避免同一项目维护多套等价依赖入口。
211
+ "no-restricted-imports": [
212
+ "error",
213
+ {
214
+ paths: [
215
+ {
216
+ name: "lodash",
217
+ message: 'Use "lodash-unified" consistently instead of "lodash".'
218
+ },
219
+ {
220
+ name: "lodash-es",
221
+ message: 'Use "lodash-unified" consistently instead of "lodash-es".'
222
+ }
223
+ ],
224
+ patterns: [
225
+ {
226
+ group: ["lodash/*", "lodash-es/*"],
227
+ message: 'Use exports from "lodash-unified" instead of Lodash subpath imports.'
228
+ }
229
+ ]
230
+ }
231
+ ]
232
+ };
233
+ var preferLodashRules = {
234
+ // [高影响][按需启用] 禁止混用 lodash-es 与 lodash-unified,保持运行时和类型来源一致。
235
+ "no-restricted-imports": [
236
+ "error",
237
+ {
238
+ paths: [
239
+ {
240
+ name: "lodash-es",
241
+ message: 'Use "lodash" consistently instead of "lodash-es".'
242
+ },
243
+ {
244
+ name: "lodash-unified",
245
+ message: 'Use "lodash" consistently instead of "lodash-unified".'
246
+ }
247
+ ],
248
+ patterns: [
249
+ {
250
+ group: ["lodash-es/*", "lodash-unified/*"],
251
+ message: 'Use "lodash" or a "lodash/*" subpath consistently.'
252
+ }
253
+ ]
254
+ }
255
+ ]
256
+ };
257
+
245
258
  // src/rules/sort-package.ts
246
259
  var packageJsonSortRules = {
247
- // [高影响][可自动修复] npm 的 files 清单按字母排序;数组顺序不改打包集合,但首次 diff 较大。
260
+ // [高影响][可自动修复][按需启用] npm 的 files 清单按字母排序;数组顺序不改打包集合,但首次 diff 较大。
248
261
  "jsonc/sort-array-values": [
249
262
  "error",
250
263
  {
@@ -252,7 +265,7 @@ var packageJsonSortRules = {
252
265
  pathPattern: "^files$"
253
266
  }
254
267
  ],
255
- // [高影响][可自动修复] 仅排序明确安全的 package.json 区域,不进入 exports 条件对象。
268
+ // [高影响][可自动修复][按需启用] 仅排序明确安全的 package.json 区域,不进入 exports 条件对象。
256
269
  "jsonc/sort-keys": [
257
270
  "error",
258
271
  // 根字段按常见阅读顺序组织,减少不同项目之间的清单噪声。
@@ -320,7 +333,7 @@ var packageJsonSortRules = {
320
333
  var tsconfigJsonSortRules = {
321
334
  // tsconfig 是 JSONC,注释用于解释不直观的编译器取舍,必须保留。
322
335
  "jsonc/no-comments": "off",
323
- // [高影响][可自动修复] 只调整顶层和 compilerOptions 的键顺序,不改写任何选项值或数组。
336
+ // [高影响][可自动修复][按需启用] 只调整顶层和 compilerOptions 的键顺序,不改写任何选项值或数组。
324
337
  "jsonc/sort-keys": [
325
338
  "error",
326
339
  // 顶层按继承、选项、项目引用和文件范围的阅读顺序排列。
@@ -452,7 +465,7 @@ var typescriptRules = {
452
465
  ],
453
466
  // [默认关闭] 声明文件、全局扩展和部分 SDK 仍需要 namespace。
454
467
  "@typescript-eslint/no-namespace": "off",
455
- // any 会绕过类型检查,但在迁移和第三方边界中有合理用途,因此只警告。
468
+ // any 会绕过类型检查,但在第三方边界和渐进式类型完善中有合理用途,因此只警告。
456
469
  "@typescript-eslint/no-explicit-any": "warn",
457
470
  // [高影响] 默认要求 ESM import;CommonJS、动态加载或工具链互操作代码可能需要按文件关闭。
458
471
  "@typescript-eslint/no-require-imports": "error",
@@ -466,7 +479,7 @@ var typescriptRules = {
466
479
  ],
467
480
  // [可自动修复] 删除可由 TypeScript 明确推断的原始值类型标注,减少重复信息。
468
481
  "@typescript-eslint/no-inferrable-types": "error",
469
- // 非空断言可能隐藏空值缺陷;以警告提示逐步消除而不阻断迁移。
482
+ // 非空断言可能隐藏空值缺陷;以警告提示逐步消除,避免一次性产生大量阻断错误。
470
483
  "@typescript-eslint/no-non-null-assertion": "warn",
471
484
  // 可选链之后再做非空断言逻辑矛盾,通常表示边界条件设计有误。
472
485
  "@typescript-eslint/no-non-null-asserted-optional-chain": "error",
@@ -487,7 +500,7 @@ var vueRules = {
487
500
  "vue/no-v-html": "warn",
488
501
  // [默认关闭] TypeScript 类型 props 和 required 声明已能表达可选性,不强制每个可选 prop 提供默认值。
489
502
  "vue/require-default-prop": "off",
490
- // [高影响] 组件必须声明对外事件;旧组件迁移时会暴露未建模的公共事件 API。
503
+ // [高影响] 组件必须声明对外事件;首次启用时会暴露未建模的公共事件 API。
491
504
  "vue/require-explicit-emits": "error",
492
505
  // [默认关闭] 允许 App、Layout 等约定俗成的单词组件名。
493
506
  "vue/multi-word-component-names": "off",
@@ -514,22 +527,8 @@ var vueRules = {
514
527
  ]
515
528
  };
516
529
 
517
- // src/configs/sort-package.ts
518
- var packageJsonSortConfigs = defineConfig([
519
- {
520
- name: "@fast-china/sort/package",
521
- files: ["**/package.json"],
522
- rules: packageJsonSortRules
523
- }
524
- ]);
525
- var tsconfigJsonSortConfigs = defineConfig([
526
- {
527
- name: "@fast-china/sort/tsconfig",
528
- files: CONST_TSCONFIG,
529
- rules: tsconfigJsonSortRules
530
- }
531
- ]);
532
- var createCommonConfigs = (files = GLOB_CODE) => defineConfig([
530
+ // src/configs/common.ts
531
+ var createBaseConfigs = (files = GLOBS_CODE) => defineConfig([
533
532
  {
534
533
  name: "@fast-china/common",
535
534
  files: [...files],
@@ -539,13 +538,18 @@ var createCommonConfigs = (files = GLOB_CODE) => defineConfig([
539
538
  rules: commonRules
540
539
  }
541
540
  ]);
542
- var commonConfigs = createCommonConfigs();
543
- var createEnvironmentConfigs = (environment = "browser", files = GLOB_CODE) => {
541
+ var createEnvironmentConfigs = ({
542
+ environment = "browser",
543
+ files = GLOBS_CODE,
544
+ nodeFiles = GLOBS_JAVASCRIPT,
545
+ globals: projectGlobals = {}
546
+ } = {}) => {
544
547
  const runtimeGlobals = {
545
548
  ...environment !== "node" ? globals.browser : {},
546
- ...environment !== "browser" ? globals.node : {}
549
+ ...environment !== "browser" ? globals.node : {},
550
+ ...projectGlobals
547
551
  };
548
- const nodeToolingFiles = GLOB_NODE.flatMap((nodeGlob) => files.map((fileGlob) => [nodeGlob, fileGlob]));
552
+ const nodeToolingFiles = GLOBS_NODE_TOOLING.flatMap((nodeGlob) => nodeFiles.map((fileGlob) => [nodeGlob, fileGlob]));
549
553
  return defineConfig([
550
554
  {
551
555
  name: `@fast-china/globals/${environment}`,
@@ -566,36 +570,25 @@ var createEnvironmentConfigs = (environment = "browser", files = GLOB_CODE) => {
566
570
  }
567
571
  ]);
568
572
  };
569
- var browserConfigs = createEnvironmentConfigs("browser");
570
- var nodeConfigs = createEnvironmentConfigs("node");
571
- var universalConfigs = createEnvironmentConfigs("universal");
572
- var globalIgnoresConfigs = defineConfig([
573
- {
574
- name: "@fast-china/ignores/global",
575
- ignores: [
576
- CONST_NODE_MODULES,
577
- CONST_DIST,
578
- ...CONST_LOCKFILE,
579
- "**/{coverage,output,temp}/**",
580
- "**/{.nuxt,.output,.vercel,.nitro}/**",
581
- "**/{.vitepress/cache,.vite-inspect}/**",
582
- "**/CHANGELOG*.md",
583
- "**/*.min.*",
584
- "**/LICENSE*",
585
- "**/__snapshots__/**",
586
- "**/auto-import?(s).d.ts",
587
- "**/components.d.ts"
588
- ]
589
- }
573
+ var DEFAULT_IGNORE_PATTERNS = Object.freeze([
574
+ "**/node_modules/**",
575
+ "**/{dist,build,coverage,output,temp,tmp}/**",
576
+ "**/{.cache,.nuxt,.output,.vercel,.nitro}/**",
577
+ "**/{.vitepress/cache,.vite-inspect}/**",
578
+ "**/__snapshots__/**",
579
+ "**/*.min.*",
580
+ "**/auto-import?(s).d.ts",
581
+ "**/components.d.ts",
582
+ ...GLOBS_LOCKFILES
590
583
  ]);
591
- var gitignoreConfigs = defineConfig([
584
+ var createGlobalIgnores = (additionalPatterns = []) => globalIgnores([...DEFAULT_IGNORE_PATTERNS, ...additionalPatterns], "@fast-china/ignores/global");
585
+ var createGitignoreConfigs = () => defineConfig([
592
586
  {
593
587
  name: "@fast-china/ignores/git",
594
588
  ...eslintConfigFlatGitignore({ strict: false })
595
589
  }
596
590
  ]);
597
- var ignoresConfigs = defineConfig([...globalIgnoresConfigs, ...gitignoreConfigs]);
598
- var createImportConfigs = (files = GLOB_CODE) => defineConfig([
591
+ var createImportConfigs = (files = GLOBS_CODE) => defineConfig([
599
592
  {
600
593
  name: "@fast-china/import",
601
594
  files: [...files],
@@ -603,19 +596,16 @@ var createImportConfigs = (files = GLOB_CODE) => defineConfig([
603
596
  rules: importRules
604
597
  }
605
598
  ]);
606
- var importConfigs = createImportConfigs();
607
- var javascriptConfigs = defineConfig([
599
+ var createJavaScriptConfigs = (files = GLOBS_JAVASCRIPT) => defineConfig([
608
600
  {
609
601
  name: "@fast-china/javascript",
610
- files: [...GLOB_JAVASCRIPT],
611
- // 继承某些已有的规则
602
+ files: [...files],
612
603
  extends: [eslint.configs.recommended],
613
604
  languageOptions: {
614
- // 允许使用最新的 ECMAScript 语法特性
615
605
  ecmaVersion: "latest",
616
606
  parserOptions: {
617
607
  ecmaFeatures: {
618
- // 允许在 JavaScript 文件中使用 JSX。
608
+ // 普通 `.jsx` 文件需要显式开启 JSX 语法解析。
619
609
  jsx: true
620
610
  }
621
611
  }
@@ -623,164 +613,197 @@ var javascriptConfigs = defineConfig([
623
613
  rules: javascriptRules
624
614
  }
625
615
  ]);
626
- var markdownConfigs = defineConfig([
616
+ var createJsonConfigs = () => defineConfig([
617
+ {
618
+ name: "@fast-china/json/json",
619
+ files: [GLOB_JSON],
620
+ extends: [eslintPluginJsonc.configs["flat/recommended-with-json"]]
621
+ },
622
+ {
623
+ name: "@fast-china/json/jsonc",
624
+ files: [GLOB_JSONC],
625
+ extends: [eslintPluginJsonc.configs["flat/recommended-with-jsonc"]]
626
+ },
627
+ {
628
+ name: "@fast-china/json/json5",
629
+ files: [GLOB_JSON5],
630
+ extends: [eslintPluginJsonc.configs["flat/recommended-with-json5"]]
631
+ },
632
+ {
633
+ name: "@fast-china/json/vscode-settings",
634
+ files: ["**/.vscode/settings.json"],
635
+ rules: {
636
+ // VS Code 的 settings.json 使用带注释的 JSONC 方言。
637
+ "jsonc/no-comments": "off"
638
+ }
639
+ }
640
+ ]);
641
+ var createLodashConfigs = (preference, files = GLOBS_CODE) => defineConfig([
642
+ {
643
+ name: `@fast-china/lodash/${preference}`,
644
+ files: [...files],
645
+ rules: preference === "lodash" ? preferLodashRules : preferLodashUnifiedRules
646
+ }
647
+ ]);
648
+ var createMarkdownConfigs = () => defineConfig([
627
649
  {
628
650
  name: "@fast-china/markdown",
629
- files: [CONST_MD],
651
+ files: [GLOB_MARKDOWN],
630
652
  extends: [eslintMarkdown.configs.recommended]
631
653
  }
632
654
  ]);
633
- var prettierConfigs = defineConfig([
655
+ var createPrettierConfigs = () => defineConfig([
634
656
  {
635
657
  ...eslintConfigPrettierFlat,
636
658
  name: "@fast-china/prettier"
637
659
  }
638
660
  ]);
639
- var createRegexpConfigs = (files = GLOB_CODE) => defineConfig([
661
+ var createRegexpConfigs = (files = GLOBS_CODE) => defineConfig([
640
662
  {
641
663
  name: "@fast-china/regexp",
642
664
  files: [...files],
643
665
  extends: [eslintPluginRegexp.configs["flat/recommended"]]
644
666
  }
645
667
  ]);
646
- var regexpConfigs = createRegexpConfigs();
647
- var createTypeScriptCoreConfigs = ({ typeChecked = false } = {}) => defineConfig([
668
+ var createPackageJsonSortConfigs = () => defineConfig([
648
669
  {
649
- name: typeChecked ? "@fast-china/typescript/type-checked" : "@fast-china/typescript",
650
- files: [...GLOB_TYPESCRIPT],
651
- extends: [
652
- ...typeChecked ? tseslint2.configs.recommendedTypeChecked : tseslint2.configs.recommended,
653
- ...typeChecked ? tseslint2.configs.stylisticTypeChecked : tseslint2.configs.stylistic
654
- ],
655
- languageOptions: {
656
- ecmaVersion: "latest",
657
- parserOptions: {
658
- ...typeChecked ? { projectService: true } : {}
659
- }
660
- },
661
- rules: typescriptRules
670
+ name: "@fast-china/sort/package-json",
671
+ files: ["**/package.json"],
672
+ rules: packageJsonSortRules
662
673
  }
663
674
  ]);
664
- var typescriptCoreConfigs = createTypeScriptCoreConfigs();
665
- var createTypeScriptConfigs = (options = {}) => defineConfig([
666
- ...createTypeScriptCoreConfigs(options),
675
+ var createTsconfigSortConfigs = () => defineConfig([
667
676
  {
668
- name: "@fast-china/typescript/declarations",
669
- files: [CONST_DTS],
670
- rules: {
671
- "@typescript-eslint/consistent-type-imports": "off",
672
- "@typescript-eslint/no-unused-vars": "off"
673
- }
677
+ name: "@fast-china/sort/tsconfig",
678
+ files: [...GLOBS_TSCONFIG],
679
+ rules: tsconfigJsonSortRules
674
680
  }
675
681
  ]);
676
- var typescriptConfigs = createTypeScriptConfigs();
677
- var typescriptTypeCheckedConfigs = createTypeScriptConfigs({ typeChecked: true });
678
- var withoutFileScope = (config) => {
679
- const { files: _files, ...unscopedConfig } = config;
680
- return unscopedConfig;
682
+ var getTypeScriptPresetConfigs = (typeChecked, removeFileScopes = false) => {
683
+ const configs = [
684
+ ...typeChecked ? tseslint.configs.recommendedTypeChecked : tseslint.configs.recommended,
685
+ ...typeChecked ? tseslint.configs.stylisticTypeChecked : tseslint.configs.stylistic
686
+ ];
687
+ if (!removeFileScopes) return configs;
688
+ return configs.map((config) => {
689
+ const { files: _files, ...configWithoutFiles } = config;
690
+ return configWithoutFiles;
691
+ });
681
692
  };
682
- var createVueConfigs = ({ typeChecked = false, version = 3 } = {}) => {
683
- const typeScriptConfigs = [
684
- ...typeChecked ? tseslint2.configs.recommendedTypeChecked : tseslint2.configs.recommended,
685
- ...typeChecked ? tseslint2.configs.stylisticTypeChecked : tseslint2.configs.stylistic
686
- ].map((config) => withoutFileScope(config));
687
- const vueRecommendedConfigs = version === 3 ? eslintPluginVue.configs["flat/recommended"] : eslintPluginVue.configs["flat/vue2-recommended"];
693
+ var createTypeScriptParserOptions = ({ typeChecked = false, tsconfigRootDir } = {}) => ({
694
+ ...typeChecked ? { projectService: true } : {},
695
+ ...typeChecked && tsconfigRootDir ? { tsconfigRootDir } : {}
696
+ });
697
+ var createTypeScriptConfigs = (options = {}, files = GLOBS_TYPESCRIPT) => defineConfig([
698
+ {
699
+ name: options.typeChecked ? "@fast-china/typescript/type-checked" : "@fast-china/typescript",
700
+ files: [...files],
701
+ extends: getTypeScriptPresetConfigs(options.typeChecked ?? false),
702
+ languageOptions: {
703
+ ecmaVersion: "latest",
704
+ parserOptions: createTypeScriptParserOptions(options)
705
+ },
706
+ rules: typescriptRules
707
+ }
708
+ ]);
709
+ var createVueConfigs = ({ typescript = true, typescriptOptions = {} } = {}) => {
710
+ const typeChecked = typescriptOptions.typeChecked ?? false;
711
+ const typeScriptConfigs = typescript ? getTypeScriptPresetConfigs(typeChecked, true) : [];
688
712
  return defineConfig([
689
713
  {
690
- name: version === 3 ? "@fast-china/vue3" : "@fast-china/vue2",
691
- files: [CONST_VUE],
692
- extends: [eslint.configs.recommended, ...typeScriptConfigs, ...vueRecommendedConfigs],
714
+ name: typeChecked ? "@fast-china/vue/type-checked" : "@fast-china/vue",
715
+ files: [GLOB_VUE],
716
+ extends: [eslint.configs.recommended, ...typeScriptConfigs, ...eslintPluginVue.configs["flat/recommended"]],
693
717
  languageOptions: {
694
718
  ecmaVersion: "latest",
695
719
  parser: vueEslintParser,
696
720
  parserOptions: {
697
- parser: tseslint2.parser,
698
- extraFileExtensions: [".vue"],
721
+ ...typescript ? { parser: tseslint.parser, extraFileExtensions: [".vue"] } : {},
699
722
  ecmaFeatures: {
700
723
  jsx: true
701
724
  },
702
725
  sourceType: "module",
703
- ...typeChecked ? { projectService: true } : {}
726
+ ...createTypeScriptParserOptions(typescriptOptions)
704
727
  }
705
728
  },
706
729
  rules: {
707
- ...typescriptRules,
730
+ ...typescript ? typescriptRules : {},
708
731
  ...vueRules
709
732
  }
710
733
  }
711
734
  ]);
712
735
  };
713
- var vueConfigs = createVueConfigs();
714
- var vue2Configs = createVueConfigs({ version: 2 });
715
- var vueTypeCheckedConfigs = createVueConfigs({ typeChecked: true });
716
736
 
717
737
  // src/factory.ts
718
- var defaultOptions = Object.freeze({
738
+ var defaultConfigOptions = Object.freeze({
719
739
  environment: "browser",
720
740
  gitignore: true,
721
741
  imports: true,
742
+ javascript: true,
722
743
  json: true,
744
+ lodash: false,
723
745
  markdown: true,
724
746
  prettier: true,
725
747
  regexp: true,
748
+ sortPackageJson: false,
749
+ sortTsconfig: false,
726
750
  typescript: true,
727
- vue: 3
751
+ vue: true
728
752
  });
729
- var createConfig = (options = {}) => {
730
- const resolvedOptions = { ...defaultOptions, ...options };
731
- const typeScriptEnabled = resolvedOptions.typescript !== false;
732
- const typeScriptOptions = typeof resolvedOptions.typescript === "object" ? resolvedOptions.typescript : {};
733
- const vueEnabled = resolvedOptions.vue !== false;
734
- let vueOptions = {
735
- typeChecked: typeScriptOptions.typeChecked,
736
- version: 3
737
- };
738
- if (typeof resolvedOptions.vue === "number") {
739
- vueOptions = { ...vueOptions, version: resolvedOptions.vue };
740
- } else if (typeof resolvedOptions.vue === "object") {
741
- vueOptions = { ...vueOptions, ...resolvedOptions.vue };
742
- }
743
- const codeFiles = [...GLOB_JAVASCRIPT, ...typeScriptEnabled ? GLOB_TYPESCRIPT : [], ...vueEnabled ? [CONST_VUE] : []];
753
+ var fastConfig = (options = {}, ...overrides) => {
754
+ const environment = options.environment ?? defaultConfigOptions.environment;
755
+ const gitignore = options.gitignore ?? defaultConfigOptions.gitignore;
756
+ const imports = options.imports ?? defaultConfigOptions.imports;
757
+ const javascript = options.javascript ?? defaultConfigOptions.javascript;
758
+ const json = options.json ?? defaultConfigOptions.json;
759
+ const lodash = options.lodash ?? defaultConfigOptions.lodash;
760
+ const markdown = options.markdown ?? defaultConfigOptions.markdown;
761
+ const prettier = options.prettier ?? defaultConfigOptions.prettier;
762
+ const regexp = options.regexp ?? defaultConfigOptions.regexp;
763
+ const sortPackageJson = options.sortPackageJson ?? defaultConfigOptions.sortPackageJson;
764
+ const sortTsconfig = options.sortTsconfig ?? defaultConfigOptions.sortTsconfig;
765
+ const typescript = options.typescript ?? defaultConfigOptions.typescript;
766
+ const vue = options.vue ?? defaultConfigOptions.vue;
767
+ const typeScriptEnabled = typescript !== false;
768
+ const typeScriptOptions = typeof typescript === "object" ? typescript : {};
769
+ const projectRules = options.rules;
770
+ const scriptFiles = [...javascript ? GLOBS_JAVASCRIPT : [], ...typeScriptEnabled ? GLOBS_TYPESCRIPT : []];
771
+ const codeFiles = [...scriptFiles, ...vue ? [GLOB_VUE] : []];
772
+ const jsonEnabled = json || sortPackageJson || sortTsconfig;
744
773
  return defineConfig([
745
- ...globalIgnoresConfigs,
746
- ...resolvedOptions.gitignore ? gitignoreConfigs : [],
747
- ...resolvedOptions.ignores?.length ? [
774
+ createGlobalIgnores(options.ignores),
775
+ ...gitignore ? createGitignoreConfigs() : [],
776
+ ...codeFiles.length ? [
777
+ ...createEnvironmentConfigs({
778
+ environment,
779
+ files: codeFiles,
780
+ globals: options.globals,
781
+ nodeFiles: scriptFiles
782
+ }),
783
+ ...createBaseConfigs(codeFiles)
784
+ ] : [],
785
+ ...javascript ? createJavaScriptConfigs() : [],
786
+ ...imports && codeFiles.length ? createImportConfigs(codeFiles) : [],
787
+ ...lodash && codeFiles.length ? createLodashConfigs(lodash, codeFiles) : [],
788
+ ...regexp && codeFiles.length ? createRegexpConfigs(codeFiles) : [],
789
+ ...typeScriptEnabled ? createTypeScriptConfigs(typeScriptOptions) : [],
790
+ ...jsonEnabled ? createJsonConfigs() : [],
791
+ ...sortPackageJson ? createPackageJsonSortConfigs() : [],
792
+ ...sortTsconfig ? createTsconfigSortConfigs() : [],
793
+ ...vue ? createVueConfigs({ typescript: typeScriptEnabled, typescriptOptions: typeScriptOptions }) : [],
794
+ ...markdown ? createMarkdownConfigs() : [],
795
+ ...prettier ? createPrettierConfigs() : [],
796
+ ...projectRules && codeFiles.length ? [
748
797
  {
749
- name: "@fast-china/ignores/custom",
750
- ignores: resolvedOptions.ignores
798
+ name: "@fast-china/project/rules",
799
+ files: codeFiles,
800
+ rules: projectRules
751
801
  }
752
802
  ] : [],
753
- ...createEnvironmentConfigs(resolvedOptions.environment, codeFiles),
754
- ...createCommonConfigs(codeFiles),
755
- ...javascriptConfigs,
756
- ...resolvedOptions.imports ? createImportConfigs(codeFiles) : [],
757
- ...resolvedOptions.regexp ? createRegexpConfigs(codeFiles) : [],
758
- ...typeScriptEnabled ? createTypeScriptConfigs(typeScriptOptions) : [],
759
- ...resolvedOptions.json ? [...jsonConfigs, ...packageJsonSortConfigs, ...tsconfigJsonSortConfigs] : [],
760
- ...vueEnabled ? createVueConfigs(vueOptions) : [],
761
- ...resolvedOptions.markdown ? markdownConfigs : [],
762
- ...resolvedOptions.prettier ? prettierConfigs : []
803
+ ...overrides
763
804
  ]);
764
805
  };
765
806
 
766
- // src/index.ts
767
- var PresetJavascriptConfigs = createConfig({
768
- json: false,
769
- markdown: false,
770
- typescript: false,
771
- vue: false
772
- });
773
- var PresetJsonConfigs = [...jsonConfigs, ...packageJsonSortConfigs, ...tsconfigJsonSortConfigs];
774
- var PresetTypescriptConfigs = createConfig({
775
- json: false,
776
- markdown: false,
777
- vue: false
778
- });
779
- var PresetTypeScriptConfigs = PresetTypescriptConfigs;
780
- var PresetBasicConfigs = createConfig({ markdown: false, vue: false });
781
- var PresetVueConfigs = createConfig();
782
- var src_default = PresetVueConfigs;
783
-
784
- export { CONST_DIST, CONST_DTS, CONST_JS, CONST_JSON, CONST_JSON5, CONST_JSONC, CONST_JSX, CONST_LOCKFILE, CONST_MD, CONST_NODE_MODULES, CONST_PUBLIC, CONST_TS, CONST_TSCONFIG, CONST_TSX, CONST_VUE, CONST_YAML, GLOB_CODE, GLOB_JAVASCRIPT, GLOB_NODE, GLOB_TYPESCRIPT, PresetBasicConfigs, PresetJavascriptConfigs, PresetJsonConfigs, PresetTypeScriptConfigs, PresetTypescriptConfigs, PresetVueConfigs, browserConfigs, commonConfigs, createCommonConfigs, createConfig, createEnvironmentConfigs, createImportConfigs, createRegexpConfigs, createTypeScriptConfigs, createTypeScriptCoreConfigs, createVueConfigs, src_default as default, defaultOptions, defineRules, gitignoreConfigs, globalIgnoresConfigs, ignoresConfigs, importConfigs, javascriptConfigs, jsonConfigs, markdownConfigs, nodeConfigs, packageJsonSortConfigs, prettierConfigs, regexpConfigs, tsconfigJsonSortConfigs, typescriptConfigs, typescriptCoreConfigs, typescriptTypeCheckedConfigs, universalConfigs, vue2Configs, vueConfigs, vueTypeCheckedConfigs };
807
+ export { fastConfig as default, defaultConfigOptions, defineRules, fastConfig };
785
808
  //# sourceMappingURL=index.js.map
786
809
  //# sourceMappingURL=index.js.map