eslint-config-setup 0.3.3 → 0.5.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/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # ESLint Config Setup
2
2
 
3
+ [![Powered by Sebastian Software](https://img.shields.io/badge/Powered%20by-Sebastian%20Software-00718d?style=flat-square)](https://oss.sebastian-software.com)
3
4
  [![CI](https://github.com/sebastian-software/eslint-config-setup/actions/workflows/ci.yml/badge.svg)](https://github.com/sebastian-software/eslint-config-setup/actions/workflows/ci.yml)
4
5
  [![npm version](https://img.shields.io/npm/v/eslint-config-setup.svg)](https://www.npmjs.com/package/eslint-config-setup)
5
6
  [![npm downloads](https://img.shields.io/npm/dm/eslint-config-setup.svg)](https://www.npmjs.com/package/eslint-config-setup)
@@ -7,15 +8,15 @@
7
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
8
9
  [![Node.js](https://img.shields.io/node/v/eslint-config-setup.svg)](https://nodejs.org)
9
10
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org)
10
- [![ESLint](https://img.shields.io/badge/ESLint-9.22+-4B32C3.svg)](https://eslint.org)
11
+ [![ESLint](https://img.shields.io/badge/ESLint-10+-4B32C3.svg)](https://eslint.org)
11
12
 
12
13
  The ESLint config for teams that ship with AI and want to move fast.
13
14
 
14
15
  Most ESLint configs compose rules at runtime from dozens of plugins. That means version conflicts, plugin mismatches, and "works on my machine" differences. **ESLint Config Setup** resolves every rule at build time — you get a flat, pre-built config where every rule is already decided. No runtime composition, no surprises.
15
16
 
16
17
  - **AI guardrails** — a dedicated `ai` mode that enforces what code review can't: explicit types, strict naming, no magic values, complexity limits. Rules that humans find tedious are trivial for an AI to follow. The AI doesn't push back. It just fixes the code.
17
- - **OxLint-ready** — a single `oxlint` flag disables every ESLint rule that OxLint already covers, and `getOxlintConfig()` generates a matching OxLint config. No manual migration, no rule conflicts, no coverage gaps. Run both linters, get the full rule set at 100x the speed.
18
- - **27 plugins, one import** — TypeScript (`strictTypeChecked`), React 19, import cycles, security, browser compat, spell checking, and more. Every rule pre-resolved at build time. No plugin conflicts, no version mismatches.
18
+ - **OxLint-ready** — a single `oxlint` flag disables every ESLint rule that OxLint already covers, and `getOxlintConfig()` generates a matching OxLint config. No manual migration, no rule conflicts, no coverage gaps. Run both linters and keep the full rule surface.
19
+ - **Curated plugin stack, one import** — TypeScript (`strictTypeChecked`), React 19, import cycles, security, browser compat, spell checking, and more. Every rule pre-resolved at build time. No plugin conflicts, no version mismatches.
19
20
 
20
21
  ```typescript
21
22
  // eslint.config.ts
@@ -37,6 +38,8 @@ import { getEslintConfig } from "eslint-config-setup"
37
38
  export default await getEslintConfig({ react: true })
38
39
  ```
39
40
 
41
+ Requires Node.js >= 22, ESLint >= 10, and TypeScript >= 5.0.
42
+
40
43
  ## Configuration flags
41
44
 
42
45
  | Flag | Default | What it does |
@@ -64,12 +67,16 @@ export default config
64
67
  ## Documentation
65
68
 
66
69
  - [Getting Started](https://sebastian-software.github.io/eslint-config-setup/guide/getting-started) — installation and setup
70
+ - [React Linting](https://sebastian-software.github.io/eslint-config-setup/guide/react) — React 19 rules, compat layer, and OxLint acceleration
67
71
  - [AI Mode](https://sebastian-software.github.io/eslint-config-setup/guide/ai-mode) — why AI-generated code needs different rules
68
72
  - [OxLint Integration](https://sebastian-software.github.io/eslint-config-setup/guide/oxlint) — run ESLint + OxLint without conflicts
69
- - [All 27 Plugins](https://sebastian-software.github.io/eslint-config-setup/guide/plugins) — what's included and why
73
+ - [Included Plugins](https://sebastian-software.github.io/eslint-config-setup/guide/plugins) — what's included and why
70
74
  - [Configuration](https://sebastian-software.github.io/eslint-config-setup/guide/configuration) — flags and usage examples
71
75
  - [Rule API](https://sebastian-software.github.io/eslint-config-setup/guide/rule-api) — rule manipulation and scoped overrides
76
+ - [File Conventions](https://sebastian-software.github.io/eslint-config-setup/guide/file-conventions) — automatic test/config/story/script overrides
77
+ - [Modular Imports](https://sebastian-software.github.io/eslint-config-setup/guide/modular-imports) — compose individual config blocks manually
72
78
  - [Architecture](https://sebastian-software.github.io/eslint-config-setup/guide/architecture) — how pre-generation works
79
+ - [Contributing](https://sebastian-software.github.io/eslint-config-setup/guide/contributing) — monorepo workflow, self-linting, and hooks
73
80
 
74
81
  ## Contributing
75
82
 
@@ -77,4 +84,19 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, architecture overv
77
84
 
78
85
  ## License
79
86
 
80
- [MIT](LICENSE) — Copyright (c) 2025 [Sebastian Software GmbH](https://sebastian-software.com)
87
+ [MIT](LICENSE)
88
+
89
+ ---
90
+
91
+ <!-- sebastian-software-branding:start -->
92
+ <p align="center">
93
+ <a href="https://oss.sebastian-software.com">
94
+ <img src="https://sebastian-brand.vercel.app/sebastian-software/logo-software.svg" alt="Sebastian Software" width="240" />
95
+ </a>
96
+ </p>
97
+
98
+ <p align="center">
99
+ <a href="https://oss.sebastian-software.com">Open Source at Sebastian Software</a><br />
100
+ Copyright &copy; 2026 Sebastian Software GmbH
101
+ </p>
102
+ <!-- sebastian-software-branding:end -->
@@ -7,8 +7,6 @@ import deMorganPlugin from "eslint-plugin-de-morgan"
7
7
  import importXPlugin from "eslint-plugin-import-x"
8
8
  import jsdocPlugin from "eslint-plugin-jsdoc"
9
9
  import jsonPlugin from "@eslint/json"
10
- import jsxA11yPlugin from "eslint-plugin-jsx-a11y"
11
- import nodePlugin from "eslint-plugin-n"
12
10
  import oxlintPlugin from "eslint-plugin-oxlint"
13
11
  import packageJsonPlugin from "eslint-plugin-package-json"
14
12
  import perfectionistPlugin from "eslint-plugin-perfectionist"
@@ -27,9 +25,10 @@ export default [
27
25
  // TypeScript parser setup
28
26
  ...tseslint.configs.strictTypeChecked.slice(0, 2),
29
27
 
30
- // Base rules — all effective rules for *.ts files
28
+ // Base rules — all effective rules for TS plus shared JS/TS rules
31
29
  {
32
30
  name: "eslint-config-setup/base",
31
+ ignores: ["**/*.{md,mdx}"],
33
32
  plugins: {
34
33
  "@cspell": cspellPlugin,
35
34
  "@typescript-eslint": tseslint.plugin,
@@ -37,8 +36,6 @@ export default [
37
36
  "de-morgan": deMorganPlugin,
38
37
  "import": importXPlugin,
39
38
  "jsdoc": jsdocPlugin,
40
- "jsx-a11y": jsxA11yPlugin,
41
- "node": nodePlugin,
42
39
  "perfectionist": perfectionistPlugin,
43
40
  "regexp": regexpPlugin,
44
41
  "security": securityPlugin,
@@ -70,7 +67,6 @@ export default [
70
67
  }
71
68
  ],
72
69
  "@typescript-eslint/dot-notation": "error",
73
- "@typescript-eslint/explicit-member-accessibility": "error",
74
70
  "@typescript-eslint/member-ordering": [
75
71
  "warn",
76
72
  {
@@ -130,10 +126,6 @@ export default [
130
126
  ]
131
127
  }
132
128
  ],
133
- "@typescript-eslint/method-signature-style": [
134
- "error",
135
- "property"
136
- ],
137
129
  "@typescript-eslint/naming-convention": [
138
130
  "error",
139
131
  {
@@ -374,7 +366,12 @@ export default [
374
366
  "getBeforeSet"
375
367
  ],
376
368
  "guard-for-in": "error",
377
- "import/newline-after-import": "error",
369
+ "import/no-extraneous-dependencies": [
370
+ "error",
371
+ {
372
+ "includeTypes": true
373
+ }
374
+ ],
378
375
  "import/no-useless-path-segments": "error",
379
376
  "jsdoc/check-alignment": "error",
380
377
  "jsdoc/check-param-names": "error",
@@ -390,13 +387,9 @@ export default [
390
387
  "jsdoc/reject-function-type": "error",
391
388
  "jsdoc/require-next-type": "error",
392
389
  "jsdoc/require-returns-check": "error",
393
- "jsdoc/require-throws-type": "error",
394
390
  "jsdoc/require-yields-check": "error",
395
- "jsdoc/require-yields-type": "error",
396
391
  "jsdoc/ts-no-empty-object-type": "error",
397
392
  "jsdoc/valid-types": "error",
398
- "jsx-a11y/interactive-supports-focus": "error",
399
- "jsx-a11y/no-noninteractive-element-interactions": "error",
400
393
  "logical-assignment-operators": [
401
394
  "error",
402
395
  "always",
@@ -419,7 +412,7 @@ export default [
419
412
  "max-lines-per-function": [
420
413
  "error",
421
414
  {
422
- "max": 50,
415
+ "max": 100,
423
416
  "skipBlankLines": true,
424
417
  "skipComments": true
425
418
  }
@@ -451,6 +444,7 @@ export default [
451
444
  "no-extra-bind": "error",
452
445
  "no-fallthrough": "error",
453
446
  "no-implicit-coercion": "error",
447
+ "no-implicit-globals": "error",
454
448
  "no-labels": "error",
455
449
  "no-lone-blocks": "error",
456
450
  "no-lonely-if": "error",
@@ -480,23 +474,33 @@ export default [
480
474
  ],
481
475
  "no-script-url": "error",
482
476
  "no-self-compare": "error",
483
- "no-sequences": "error",
477
+ "no-sequences": [
478
+ "error",
479
+ {
480
+ "allowInParentheses": false
481
+ }
482
+ ],
484
483
  "no-template-curly-in-string": "error",
485
484
  "no-unmodified-loop-condition": "error",
486
485
  "no-unneeded-ternary": "error",
487
486
  "no-unreachable-loop": "error",
488
487
  "no-useless-assignment": "error",
489
488
  "no-useless-call": "error",
490
- "no-useless-computed-key": "error",
489
+ "no-useless-computed-key": [
490
+ "error",
491
+ {
492
+ "enforceForClassMembers": true
493
+ }
494
+ ],
491
495
  "no-useless-concat": "error",
492
496
  "no-useless-return": "error",
493
497
  "no-var": "error",
494
498
  "no-warning-comments": "warn",
495
- "node/no-unsupported-features/node-builtins": "error",
496
499
  "object-shorthand": [
497
500
  "error",
498
501
  "always",
499
502
  {
503
+ "avoidExplicitReturnArrows": true,
500
504
  "avoidQuotes": true
501
505
  }
502
506
  ],
@@ -531,14 +535,10 @@ export default [
531
535
  "allowNamedFunctions": true
532
536
  }
533
537
  ],
534
- "prefer-const": [
535
- "error",
536
- {
537
- "destructuring": "all"
538
- }
539
- ],
538
+ "prefer-const": "error",
540
539
  "prefer-exponentiation-operator": "error",
541
540
  "prefer-named-capture-group": "error",
541
+ "prefer-numeric-literals": "error",
542
542
  "prefer-object-has-own": "error",
543
543
  "prefer-object-spread": "error",
544
544
  "prefer-regex-literals": "error",
@@ -674,16 +674,9 @@ export default [
674
674
  "sonarjs/public-static-readonly": "error",
675
675
  "sonarjs/reduce-initial-value": "error",
676
676
  "symbol-description": "error",
677
- "unicorn/custom-error-definition": "error",
678
677
  "unicorn/no-array-push-push": "error",
678
+ "unicorn/no-for-each": "error",
679
679
  "unicorn/no-for-loop": "error",
680
- "unicorn/prefer-export-from": [
681
- "error",
682
- {
683
- "ignoreUsedVariables": true
684
- }
685
- ],
686
- "unicorn/prefer-import-meta-properties": "error",
687
680
  "unicorn/prefer-switch": [
688
681
  "error",
689
682
  {
@@ -703,12 +696,16 @@ export default [
703
696
  rules: {
704
697
  "@typescript-eslint/await-thenable": "off",
705
698
  "@typescript-eslint/consistent-return": "off",
699
+ "@typescript-eslint/consistent-type-exports": "off",
706
700
  "@typescript-eslint/dot-notation": "off",
701
+ "@typescript-eslint/member-ordering": "off",
702
+ "@typescript-eslint/naming-convention": "off",
707
703
  "@typescript-eslint/no-array-delete": "off",
708
704
  "@typescript-eslint/no-base-to-string": "off",
709
705
  "@typescript-eslint/no-confusing-void-expression": "off",
710
706
  "@typescript-eslint/no-deprecated": "off",
711
707
  "@typescript-eslint/no-duplicate-type-constituents": "off",
708
+ "@typescript-eslint/no-floating-promises": "off",
712
709
  "@typescript-eslint/no-for-in-array": "off",
713
710
  "@typescript-eslint/no-implied-eval": "off",
714
711
  "@typescript-eslint/no-meaningless-void-operator": "off",
@@ -730,6 +727,7 @@ export default [
730
727
  "@typescript-eslint/no-unsafe-enum-comparison": "off",
731
728
  "@typescript-eslint/no-unsafe-member-access": "off",
732
729
  "@typescript-eslint/no-unsafe-return": "off",
730
+ "@typescript-eslint/no-unsafe-type-assertion": "off",
733
731
  "@typescript-eslint/no-unsafe-unary-minus": "off",
734
732
  "@typescript-eslint/no-useless-default-assignment": "off",
735
733
  "@typescript-eslint/non-nullable-type-assertion-style": "off",
@@ -740,26 +738,44 @@ export default [
740
738
  "@typescript-eslint/prefer-nullish-coalescing": "off",
741
739
  "@typescript-eslint/prefer-optional-chain": "off",
742
740
  "@typescript-eslint/prefer-promise-reject-errors": "off",
741
+ "@typescript-eslint/prefer-readonly": "off",
743
742
  "@typescript-eslint/prefer-readonly-parameter-types": "off",
744
743
  "@typescript-eslint/prefer-reduce-type-parameter": "off",
745
744
  "@typescript-eslint/prefer-regexp-exec": "off",
746
745
  "@typescript-eslint/prefer-return-this-type": "off",
747
746
  "@typescript-eslint/prefer-string-starts-ends-with": "off",
747
+ "@typescript-eslint/promise-function-async": "off",
748
748
  "@typescript-eslint/related-getter-setter-pairs": "off",
749
+ "@typescript-eslint/require-array-sort-compare": "off",
749
750
  "@typescript-eslint/require-await": "off",
750
751
  "@typescript-eslint/restrict-plus-operands": "off",
751
752
  "@typescript-eslint/restrict-template-expressions": "off",
752
753
  "@typescript-eslint/return-await": "off",
753
754
  "@typescript-eslint/strict-boolean-expressions": "off",
754
755
  "@typescript-eslint/strict-void-return": "off",
756
+ "@typescript-eslint/switch-exhaustiveness-check": "off",
755
757
  "@typescript-eslint/unbound-method": "off",
756
758
  "@typescript-eslint/use-unknown-in-catch-callback-variable": "off",
757
- "getter-return": "error",
759
+ "dot-notation": "off",
760
+ "no-array-constructor": "off",
758
761
  "no-dupe-args": "error",
762
+ "no-empty-function": "off",
763
+ "no-implied-eval": "off",
759
764
  "no-new-symbol": "off",
760
765
  "no-redeclare": "error",
766
+ "no-return-await": "off",
767
+ "no-shadow": "off",
768
+ "no-throw-literal": "off",
761
769
  "no-undef": "error",
762
- "no-unreachable": "error"
770
+ "no-useless-constructor": "off",
771
+ "prefer-const": [
772
+ "error",
773
+ {
774
+ "destructuring": "all"
775
+ }
776
+ ],
777
+ "prefer-promise-reject-errors": "off",
778
+ "require-await": "off"
763
779
  },
764
780
  },
765
781
 
@@ -806,8 +822,7 @@ export default [
806
822
  "vitest/prefer-strict-equal": "error",
807
823
  "vitest/prefer-to-be": "error",
808
824
  "vitest/prefer-to-have-length": "error",
809
- "vitest/require-top-level-describe": "error",
810
- "vitest/valid-title": "error"
825
+ "vitest/require-top-level-describe": "error"
811
826
  },
812
827
  },
813
828
 
@@ -988,7 +1003,87 @@ export default [
988
1003
  // Markdown/MDX code block linting
989
1004
  {
990
1005
  ...mdxPlugin.flatCodeBlocks,
1006
+ languageOptions: {
1007
+ ...mdxPlugin.flatCodeBlocks.languageOptions,
1008
+ parserOptions: {
1009
+ ...mdxPlugin.flatCodeBlocks.languageOptions?.parserOptions,
1010
+ projectService: false,
1011
+ },
1012
+ },
991
1013
  rules: {
1014
+ ...{
1015
+ "@typescript-eslint/await-thenable": "off",
1016
+ "@typescript-eslint/consistent-type-exports": "off",
1017
+ "@typescript-eslint/dot-notation": "off",
1018
+ "@typescript-eslint/member-ordering": "off",
1019
+ "@typescript-eslint/naming-convention": "off",
1020
+ "@typescript-eslint/no-array-delete": "off",
1021
+ "@typescript-eslint/no-base-to-string": "off",
1022
+ "@typescript-eslint/no-confusing-void-expression": "off",
1023
+ "@typescript-eslint/no-deprecated": "off",
1024
+ "@typescript-eslint/no-duplicate-type-constituents": "off",
1025
+ "@typescript-eslint/no-floating-promises": "off",
1026
+ "@typescript-eslint/no-for-in-array": "off",
1027
+ "@typescript-eslint/no-implied-eval": "off",
1028
+ "@typescript-eslint/no-meaningless-void-operator": "off",
1029
+ "@typescript-eslint/no-misused-promises": "off",
1030
+ "@typescript-eslint/no-misused-spread": "off",
1031
+ "@typescript-eslint/no-mixed-enums": "off",
1032
+ "@typescript-eslint/no-redundant-type-constituents": "off",
1033
+ "@typescript-eslint/no-unnecessary-boolean-literal-compare": "off",
1034
+ "@typescript-eslint/no-unnecessary-condition": "off",
1035
+ "@typescript-eslint/no-unnecessary-qualifier": "off",
1036
+ "@typescript-eslint/no-unnecessary-template-expression": "off",
1037
+ "@typescript-eslint/no-unnecessary-type-arguments": "off",
1038
+ "@typescript-eslint/no-unnecessary-type-assertion": "off",
1039
+ "@typescript-eslint/no-unnecessary-type-conversion": "off",
1040
+ "@typescript-eslint/no-unnecessary-type-parameters": "off",
1041
+ "@typescript-eslint/no-unsafe-argument": "off",
1042
+ "@typescript-eslint/no-unsafe-assignment": "off",
1043
+ "@typescript-eslint/no-unsafe-call": "off",
1044
+ "@typescript-eslint/no-unsafe-enum-comparison": "off",
1045
+ "@typescript-eslint/no-unsafe-member-access": "off",
1046
+ "@typescript-eslint/no-unsafe-return": "off",
1047
+ "@typescript-eslint/no-unsafe-type-assertion": "off",
1048
+ "@typescript-eslint/no-unsafe-unary-minus": "off",
1049
+ "@typescript-eslint/no-useless-default-assignment": "off",
1050
+ "@typescript-eslint/non-nullable-type-assertion-style": "off",
1051
+ "@typescript-eslint/only-throw-error": "off",
1052
+ "@typescript-eslint/prefer-find": "off",
1053
+ "@typescript-eslint/prefer-includes": "off",
1054
+ "@typescript-eslint/prefer-nullish-coalescing": "off",
1055
+ "@typescript-eslint/prefer-optional-chain": "off",
1056
+ "@typescript-eslint/prefer-promise-reject-errors": "off",
1057
+ "@typescript-eslint/prefer-readonly": "off",
1058
+ "@typescript-eslint/prefer-reduce-type-parameter": "off",
1059
+ "@typescript-eslint/prefer-regexp-exec": "off",
1060
+ "@typescript-eslint/prefer-return-this-type": "off",
1061
+ "@typescript-eslint/prefer-string-starts-ends-with": "off",
1062
+ "@typescript-eslint/promise-function-async": "off",
1063
+ "@typescript-eslint/related-getter-setter-pairs": "off",
1064
+ "@typescript-eslint/require-array-sort-compare": "off",
1065
+ "@typescript-eslint/require-await": "off",
1066
+ "@typescript-eslint/restrict-plus-operands": "off",
1067
+ "@typescript-eslint/restrict-template-expressions": "off",
1068
+ "@typescript-eslint/return-await": "off",
1069
+ "@typescript-eslint/strict-boolean-expressions": "off",
1070
+ "@typescript-eslint/strict-void-return": "off",
1071
+ "@typescript-eslint/switch-exhaustiveness-check": "off",
1072
+ "@typescript-eslint/unbound-method": "off",
1073
+ "@typescript-eslint/use-unknown-in-catch-callback-variable": "off",
1074
+ "dot-notation": "off",
1075
+ "no-array-constructor": "off",
1076
+ "no-empty-function": "off",
1077
+ "no-implied-eval": "off",
1078
+ "no-return-await": "off",
1079
+ "no-shadow": "off",
1080
+ "no-throw-literal": "off",
1081
+ "no-useless-constructor": "off",
1082
+ "prefer-promise-reject-errors": "off",
1083
+ "require-await": "off",
1084
+ "strict": "off",
1085
+ "unicode-bom": "off"
1086
+ },
992
1087
  ...mdxPlugin.flatCodeBlocks.rules,
993
1088
  "eol-last": "off",
994
1089
  "no-undef": "off",
@@ -1001,10 +1096,10 @@ export default [
1001
1096
  },
1002
1097
 
1003
1098
  // OxLint integration — disables rules already covered by OxLint
1004
- ...[oxlintPlugin.configs["flat/recommended"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint", ...c })),
1005
- ...[oxlintPlugin.configs["flat/typescript"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-typescript", ...c })),
1006
- ...[oxlintPlugin.configs["flat/unicorn"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-unicorn", ...c })),
1007
- ...[oxlintPlugin.configs["flat/import"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-import", ...c })),
1008
- ...[oxlintPlugin.configs["flat/jsdoc"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-jsdoc", ...c })),
1099
+ ...[oxlintPlugin.configs["flat/recommended"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint" + (array.length > 1 ? "-" + (index + 1) : "") })),
1100
+ ...[oxlintPlugin.configs["flat/typescript"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-typescript" + (array.length > 1 ? "-" + (index + 1) : "") })),
1101
+ ...[oxlintPlugin.configs["flat/unicorn"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-unicorn" + (array.length > 1 ? "-" + (index + 1) : "") })),
1102
+ ...[oxlintPlugin.configs["flat/import"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-import" + (array.length > 1 ? "-" + (index + 1) : "") })),
1103
+ ...[oxlintPlugin.configs["flat/jsdoc"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-jsdoc" + (array.length > 1 ? "-" + (index + 1) : "") })),
1009
1104
 
1010
1105
  ]