@ztd-me/eslint 0.0.0-stage → 0.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.
@@ -0,0 +1,253 @@
1
+ # Research rule coverage
2
+
3
+ The starting points are `eslint-rules-research.zh-CN.md` (Library `libfile_54b1fabff9dc8191964118f1efc89e81`) and `eslint-rules-exact-catalog.zh-CN.md` (`libfile_25c98595e1148191a893667c0a105b0b`), researched on 2026-10-01. The cloud executor retrieved complete 372-line and 242-line Library reads; byte materialization failed including its single supported retry. The implementation used retained read text rather than assuming another executor’s paths.
4
+
5
+ All 198 catalog entries have an explicit disposition: 157 enabled in their applicable profiles, 32 JSX accessibility entries deferred by user instruction, four transitional array entries replaced by `ztd/array-layout`, four Compiler entries opt-in, and one fetch entry experimental opt-in. The effective-config tests verify every enabled severity and explicit option against the selected dependency versions. Retained baseline entries are counted, not presented as new rules.
6
+
7
+ | Dependency | Selected version |
8
+ | --- | --- |
9
+ | Node / pnpm (cloud validation) | 24.19.0 / 11.19.0 |
10
+ | ESLint / TypeScript | 10.11.0 / 6.0.3 |
11
+ | @antfu/eslint-config | 9.5.1 |
12
+ | @typescript-eslint parser / plugin | 8.71.0 / 8.71.0 |
13
+ | @stylistic/eslint-plugin | 5.10.0 |
14
+ | @eslint-react/eslint-plugin / react-hooks / react-refresh | 5.23.3 / 7.1.1 / 0.5.7 |
15
+ | eslint-plugin-vue / vue-eslint-parser | 10.11.1 / 10.4.1 |
16
+ | eslint-plugin-vuejs-accessibility | 2.6.0 |
17
+ | eslint-plugin-sonarjs | 4.2.2 |
18
+ | @vitest/eslint-plugin | 1.6.27 |
19
+
20
+ Core/TS extensions, unused-variable owners, React Hooks owners, SFC line-width owners and array layout owners are deduplicated. Handwritten `.d.ts`, configuration and script files retain strict safety and size rules after antfu disables. JS-specific setter diagnostics remain with the TS compiler in TS files. Typed constant-expression checks use `ts/no-unnecessary-condition`; JS keeps `no-constant-binary-expression`. The public factory fixes editor behavior so selected severities do not vary between editor and CI.
21
+
22
+ The implementation does not claim a Vue index-key check: current stable Vue rules ensure a key exists but cannot ensure it is not a loop index. Vue template typing and dynamic component inference also remain outside this package’s static proof boundary.
23
+
24
+ ## shared
25
+
26
+ | Rule | Exact researched value | Disposition |
27
+ | --- | --- | --- |
28
+ | [complexity](https://eslint.org/docs/latest/rules/complexity) | `["error",{"max":10,"variant":"classic"}]` | enabled |
29
+ | [sonarjs/cognitive-complexity](https://sonarsource.github.io/rspec/#/rspec/S3776/javascript) | `["error",15]` | enabled |
30
+ | [max-depth](https://eslint.org/docs/latest/rules/max-depth) | `["error",{"max":4}]` | enabled |
31
+ | [max-lines-per-function](https://eslint.org/docs/latest/rules/max-lines-per-function) | `["error",{"max":60,"skipBlankLines":true,"skipComments":true,"IIFEs":true}]` | enabled |
32
+ | [max-lines](https://eslint.org/docs/latest/rules/max-lines) | `["error",{"max":300,"skipBlankLines":true,"skipComments":true}]` | enabled |
33
+ | [max-params](https://eslint.org/docs/latest/rules/max-params) | `["error",{"max":4}]` | enabled |
34
+ | [style/max-len](https://eslint.style/rules/max-len) | `["error",{"code":120,"comments":120,"tabWidth":2,"ignoreUrls":true,"ignoreStrings":false,"ignoreTemplateLiterals":false,"ignoreRegExpLiterals":false,"ignoreComments":false,"ignoreTrailingComments":false}]` | enabled |
35
+ | [eqeqeq](https://eslint.org/docs/latest/rules/eqeqeq) | `["error","always"]` | enabled |
36
+ | [curly](https://eslint.org/docs/latest/rules/curly) | `["error","all"]` | enabled |
37
+ | [array-callback-return](https://eslint.org/docs/latest/rules/array-callback-return) | `["error",{"allowImplicit":false,"checkForEach":true,"allowVoid":false}]` | enabled |
38
+ | [no-empty](https://eslint.org/docs/latest/rules/no-empty) | `["error",{"allowEmptyCatch":false}]` | enabled |
39
+ | [no-shadow](https://eslint.org/docs/latest/rules/no-shadow) | `["error",{"builtinGlobals":false,"hoist":"all","ignoreOnInitialization":false}]` | enabled |
40
+ | [no-nested-ternary](https://eslint.org/docs/latest/rules/no-nested-ternary) | `"error"` | enabled |
41
+ | [no-unused-expressions](https://eslint.org/docs/latest/rules/no-unused-expressions) | `["error",{"allowShortCircuit":false,"allowTernary":false,"allowTaggedTemplates":true,"enforceForJSX":true}]` | enabled |
42
+ | [eslint-comments/require-description](https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/require-description.html) | `["error",{"ignore":["eslint-enable"]}]` | enabled |
43
+ | [unused-imports/no-unused-vars](https://github.com/sweepline/eslint-plugin-unused-imports/blob/master/docs/rules/no-unused-vars.md) | `["error",{"args":"all","argsIgnorePattern":"^_","caughtErrors":"all","caughtErrorsIgnorePattern":"^_","vars":"all","varsIgnorePattern":"^_","ignoreRestSiblings":true,"reportUsedIgnorePattern":true}]` | enabled |
44
+ | [style/array-bracket-newline](https://eslint.style/rules/array-bracket-newline) | `["error",{"multiline":true}]` | replaced: ztd/array-layout (full researched policy) |
45
+ | [style/array-element-newline](https://eslint.style/rules/array-element-newline) | `["error",{"ArrayExpression":{"minItems":3,"multiline":true,"consistent":true},"ArrayPattern":"consistent"}]` | replaced: ztd/array-layout (full researched policy) |
46
+ | [no-constant-binary-expression](https://eslint.org/docs/latest/rules/no-constant-binary-expression) | `"error"` | enabled |
47
+ | [no-unsafe-optional-chaining](https://eslint.org/docs/latest/rules/no-unsafe-optional-chaining) | `["error",{"disallowArithmeticOperators":true}]` | enabled |
48
+ | [no-promise-executor-return](https://eslint.org/docs/latest/rules/no-promise-executor-return) | `["error",{"allowVoid":false}]` | enabled |
49
+ | [no-setter-return](https://eslint.org/docs/latest/rules/no-setter-return) | `"error"` | enabled |
50
+ ## ts-syntax
51
+
52
+ | Rule | Exact researched value | Disposition |
53
+ | --- | --- | --- |
54
+ | [ts/no-explicit-any](https://typescript-eslint.io/rules/no-explicit-any) | `["error",{"fixToUnknown":false,"ignoreRestArgs":false}]` | enabled |
55
+ | [ts/no-non-null-assertion](https://typescript-eslint.io/rules/no-non-null-assertion) | `"error"` | enabled |
56
+ | [ts/no-empty-object-type](https://typescript-eslint.io/rules/no-empty-object-type) | `["error",{"allowInterfaces":"never","allowObjectTypes":"never"}]` | enabled |
57
+ | [ts/ban-ts-comment](https://typescript-eslint.io/rules/ban-ts-comment) | `["error",{"ts-ignore":true,"ts-nocheck":true,"ts-check":false,"ts-expect-error":"allow-with-description","minimumDescriptionLength":10}]` | enabled |
58
+ | [ts/consistent-type-assertions](https://typescript-eslint.io/rules/consistent-type-assertions) | `["error",{"assertionStyle":"as","objectLiteralTypeAssertions":"never","arrayLiteralTypeAssertions":"never"}]` | enabled |
59
+ | [ts/explicit-module-boundary-types](https://typescript-eslint.io/rules/explicit-module-boundary-types) | `["error",{"allowArgumentsExplicitlyTypedAsAny":false,"allowDirectConstAssertionInArrowFunctions":false,"allowHigherOrderFunctions":false,"allowOverloadFunctions":false,"allowTypedFunctionExpressions":true}]` | enabled |
60
+ | [ts/no-useless-constructor](https://typescript-eslint.io/rules/no-useless-constructor) | `"error"` | enabled |
61
+ | [ts/no-invalid-void-type](https://typescript-eslint.io/rules/no-invalid-void-type) | `["error",{"allowAsThisParameter":true,"allowInGenericTypeArguments":true}]` | enabled |
62
+ | [ts/no-extraneous-class](https://typescript-eslint.io/rules/no-extraneous-class) | `["error",{"allowConstructorOnly":false,"allowEmpty":false,"allowStaticOnly":false,"allowWithDecorator":true}]` | enabled |
63
+ | [ts/max-params](https://typescript-eslint.io/rules/max-params) | `["error",{"max":4,"countVoidThis":false}]` | enabled |
64
+ | [ts/no-shadow](https://typescript-eslint.io/rules/no-shadow) | `["error",{"builtinGlobals":false,"hoist":"functions-and-types","ignoreOnInitialization":false,"ignoreTypeValueShadow":true,"ignoreFunctionTypeParameterNameValueShadow":true}]` | enabled |
65
+ | [ts/no-unused-expressions](https://typescript-eslint.io/rules/no-unused-expressions) | `["error",{"allowShortCircuit":false,"allowTernary":false,"allowTaggedTemplates":true,"enforceForJSX":true}]` | enabled |
66
+ ## typed
67
+
68
+ | Rule | Exact researched value | Disposition |
69
+ | --- | --- | --- |
70
+ | [ts/strict-boolean-expressions](https://typescript-eslint.io/rules/strict-boolean-expressions) | `["error",{"allowAny":false,"allowNumber":false,"allowString":false,"allowNullableBoolean":false,"allowNullableEnum":false,"allowNullableNumber":false,"allowNullableObject":false,"allowNullableString":false}]` | enabled |
71
+ | [ts/no-floating-promises](https://typescript-eslint.io/rules/no-floating-promises) | `["error",{"checkThenables":true,"ignoreVoid":false,"ignoreIIFE":false,"allowForKnownSafeCalls":[],"allowForKnownSafePromises":[]}]` | enabled |
72
+ | [ts/no-misused-promises](https://typescript-eslint.io/rules/no-misused-promises) | `["error",{"checksConditionals":{"flagUnions":"all"},"checksSpreads":true,"checksVoidReturn":true}]` | enabled |
73
+ | [ts/restrict-plus-operands](https://typescript-eslint.io/rules/restrict-plus-operands) | `["error",{"allowAny":false,"allowBoolean":false,"allowNullish":false,"allowNumberAndString":false,"allowRegExp":false,"skipCompoundAssignments":false}]` | enabled |
74
+ | [ts/restrict-template-expressions](https://typescript-eslint.io/rules/restrict-template-expressions) | `["error",{"allow":[],"allowAny":false,"allowArray":false,"allowBoolean":false,"allowNullish":false,"allowNumber":true,"allowRegExp":false,"allowNever":false}]` | enabled |
75
+ | [ts/return-await](https://typescript-eslint.io/rules/return-await) | `["error","always"]` | enabled |
76
+ | [ts/switch-exhaustiveness-check](https://typescript-eslint.io/rules/switch-exhaustiveness-check) | `["error",{"allowDefaultCaseForExhaustiveSwitch":true,"considerDefaultExhaustiveForUnions":false,"requireDefaultForNonUnion":true}]` | enabled |
77
+ | [ts/only-throw-error](https://typescript-eslint.io/rules/only-throw-error) | `["error",{"allow":[],"allowRethrowing":true,"allowThrowingAny":false,"allowThrowingUnknown":false}]` | enabled |
78
+ | [ts/no-unsafe-type-assertion](https://typescript-eslint.io/rules/no-unsafe-type-assertion) | `"error"` | enabled |
79
+ | [ts/use-unknown-in-catch-callback-variable](https://typescript-eslint.io/rules/use-unknown-in-catch-callback-variable) | `"error"` | enabled |
80
+ | [ts/no-unnecessary-condition](https://typescript-eslint.io/rules/no-unnecessary-condition) | `["error",{"allowConstantLoopConditions":"only-allowed-literals","checkTypePredicates":true}]` | enabled |
81
+ | [ts/no-base-to-string](https://typescript-eslint.io/rules/no-base-to-string) | `["error",{"checkUnknown":true,"ignoredTypeNames":["Error","RegExp","URL","URLSearchParams"]}]` | enabled |
82
+ | [ts/no-misused-spread](https://typescript-eslint.io/rules/no-misused-spread) | `["error",{"allow":[]}]` | enabled |
83
+ | [ts/no-unsafe-enum-comparison](https://typescript-eslint.io/rules/no-unsafe-enum-comparison) | `"error"` | enabled |
84
+ | [ts/no-deprecated](https://typescript-eslint.io/rules/no-deprecated) | `["error",{"allow":[]}]` | enabled |
85
+ | [ts/consistent-type-exports](https://typescript-eslint.io/rules/consistent-type-exports) | `["error",{"fixMixedExportsWithInlineTypeSpecifier":false}]` | enabled |
86
+ | [ts/prefer-readonly](https://typescript-eslint.io/rules/prefer-readonly) | `["error",{"onlyInlineLambdas":false}]` | enabled |
87
+ | [ts/require-array-sort-compare](https://typescript-eslint.io/rules/require-array-sort-compare) | `["error",{"ignoreStringArrays":true}]` | enabled |
88
+ | [ts/require-await](https://typescript-eslint.io/rules/require-await) | `"error"` | enabled |
89
+ | [ts/prefer-nullish-coalescing](https://typescript-eslint.io/rules/prefer-nullish-coalescing) | `["error",{"ignoreConditionalTests":true,"ignoreMixedLogicalExpressions":false,"ignorePrimitives":{"bigint":false,"boolean":false,"number":false,"string":false}}]` | enabled |
90
+ | [ts/prefer-optional-chain](https://typescript-eslint.io/rules/prefer-optional-chain) | `["error",{"requireNullish":true,"allowPotentiallyUnsafeFixesThatModifyTheReturnTypeIKnowWhatImDoing":false}]` | enabled |
91
+ | [ts/no-array-delete](https://typescript-eslint.io/rules/no-array-delete) | `"error"` | enabled |
92
+ | [ts/no-unsafe-unary-minus](https://typescript-eslint.io/rules/no-unsafe-unary-minus) | `"error"` | enabled |
93
+ | [ts/prefer-promise-reject-errors](https://typescript-eslint.io/rules/prefer-promise-reject-errors) | `["error",{"allowEmptyReject":false,"allowThrowingAny":false,"allowThrowingUnknown":false}]` | enabled |
94
+ | [ts/await-thenable](https://typescript-eslint.io/rules/await-thenable) | `"error"` | enabled |
95
+ | [ts/no-for-in-array](https://typescript-eslint.io/rules/no-for-in-array) | `"error"` | enabled |
96
+ | [ts/no-implied-eval](https://typescript-eslint.io/rules/no-implied-eval) | `"error"` | enabled |
97
+ | [ts/no-unnecessary-type-assertion](https://typescript-eslint.io/rules/no-unnecessary-type-assertion) | `"error"` | enabled |
98
+ | [ts/no-unsafe-argument](https://typescript-eslint.io/rules/no-unsafe-argument) | `"error"` | enabled |
99
+ | [ts/no-unsafe-assignment](https://typescript-eslint.io/rules/no-unsafe-assignment) | `"error"` | enabled |
100
+ | [ts/no-unsafe-call](https://typescript-eslint.io/rules/no-unsafe-call) | `"error"` | enabled |
101
+ | [ts/no-unsafe-member-access](https://typescript-eslint.io/rules/no-unsafe-member-access) | `"error"` | enabled |
102
+ | [ts/no-unsafe-return](https://typescript-eslint.io/rules/no-unsafe-return) | `"error"` | enabled |
103
+ | [ts/unbound-method](https://typescript-eslint.io/rules/unbound-method) | `"error"` | enabled |
104
+ ## react
105
+
106
+ | Rule | Exact researched value | Disposition |
107
+ | --- | --- | --- |
108
+ | [react/exhaustive-deps](https://eslint-react.xyz/docs/rules/exhaustive-deps) | `["error",{"enableDangerousAutofixThisMayCauseInfiniteLoops":false,"requireExplicitEffectDeps":false}]` | enabled |
109
+ | [react/no-array-index-key](https://eslint-react.xyz/docs/rules/no-array-index-key) | `"error"` | enabled |
110
+ | [react/purity](https://eslint-react.xyz/docs/rules/purity) | `"error"` | enabled |
111
+ | [react/set-state-in-effect](https://eslint-react.xyz/docs/rules/set-state-in-effect) | `"error"` | enabled |
112
+ | [react/web-api-no-leaked-event-listener](https://eslint-react.xyz/docs/rules/web-api-no-leaked-event-listener) | `"error"` | enabled |
113
+ | [react/web-api-no-leaked-intersection-observer](https://eslint-react.xyz/docs/rules/web-api-no-leaked-intersection-observer) | `"error"` | enabled |
114
+ | [react/web-api-no-leaked-interval](https://eslint-react.xyz/docs/rules/web-api-no-leaked-interval) | `"error"` | enabled |
115
+ | [react/web-api-no-leaked-resize-observer](https://eslint-react.xyz/docs/rules/web-api-no-leaked-resize-observer) | `"error"` | enabled |
116
+ | [react/web-api-no-leaked-timeout](https://eslint-react.xyz/docs/rules/web-api-no-leaked-timeout) | `"error"` | enabled |
117
+ | [react/jsx-no-comment-textnodes](https://eslint-react.xyz/docs/rules/jsx-no-comment-textnodes) | `"error"` | enabled |
118
+ | [react/jsx-no-leaked-dollar](https://eslint-react.xyz/docs/rules/jsx-no-leaked-dollar) | `"error"` | enabled |
119
+ | [react/jsx-no-leaked-semicolon](https://eslint-react.xyz/docs/rules/jsx-no-leaked-semicolon) | `"error"` | enabled |
120
+ | [react/dom-no-dangerously-set-innerhtml](https://eslint-react.xyz/docs/rules/dom-no-dangerously-set-innerhtml) | `"error"` | enabled |
121
+ | [react/dom-no-script-url](https://eslint-react.xyz/docs/rules/dom-no-script-url) | `"error"` | enabled |
122
+ | [react/dom-no-unsafe-iframe-sandbox](https://eslint-react.xyz/docs/rules/dom-no-unsafe-iframe-sandbox) | `"error"` | enabled |
123
+ | [react/web-api-no-leaked-fetch](https://eslint-react.xyz/docs/rules/web-api-no-leaked-fetch) | `"error"` | opt-in: react.experimental |
124
+ | [react/use-state](https://eslint-react.xyz/docs/rules/use-state) | `["error",{"enforceAssignment":true,"enforceLazyInitialization":true,"enforceSetterName":true}]` | enabled |
125
+ | [react/no-unstable-context-value](https://eslint-react.xyz/docs/rules/no-unstable-context-value) | `"error"` | enabled |
126
+ | [react/no-unstable-default-props](https://eslint-react.xyz/docs/rules/no-unstable-default-props) | `["error",{"safeDefaultProps":[]}]` | enabled |
127
+ | [react/dom-no-missing-button-type](https://eslint-react.xyz/docs/rules/dom-no-missing-button-type) | `"error"` | enabled |
128
+ | [react/dom-no-missing-iframe-sandbox](https://eslint-react.xyz/docs/rules/dom-no-missing-iframe-sandbox) | `"error"` | enabled |
129
+ | [react/dom-no-unsafe-target-blank](https://eslint-react.xyz/docs/rules/dom-no-unsafe-target-blank) | `"error"` | enabled |
130
+ | [react/rules-of-hooks](https://eslint-react.xyz/docs/rules/rules-of-hooks) | `"error"` | enabled |
131
+ | [react/error-boundaries](https://eslint-react.xyz/docs/rules/error-boundaries) | `"error"` | enabled |
132
+ | [react/no-missing-key](https://eslint-react.xyz/docs/rules/no-missing-key) | `"error"` | enabled |
133
+ | [react/no-nested-component-definitions](https://eslint-react.xyz/docs/rules/no-nested-component-definitions) | `"error"` | enabled |
134
+ | [react/no-nested-lazy-component-declarations](https://eslint-react.xyz/docs/rules/no-nested-lazy-component-declarations) | `"error"` | enabled |
135
+ | [react/set-state-in-render](https://eslint-react.xyz/docs/rules/set-state-in-render) | `"error"` | enabled |
136
+ | [react/static-components](https://eslint-react.xyz/docs/rules/static-components) | `"error"` | enabled |
137
+ | [react/use-memo](https://eslint-react.xyz/docs/rules/use-memo) | `"error"` | enabled |
138
+ | [react/dom-no-dangerously-set-innerhtml-with-children](https://eslint-react.xyz/docs/rules/dom-no-dangerously-set-innerhtml-with-children) | `"error"` | enabled |
139
+ | [react/dom-no-void-elements-with-children](https://eslint-react.xyz/docs/rules/dom-no-void-elements-with-children) | `"error"` | enabled |
140
+ | [react/no-leaked-conditional-rendering](https://eslint-react.xyz/docs/rules/no-leaked-conditional-rendering) | `"error"` | enabled: typed React files only |
141
+ | [react-hooks/globals](https://react.dev/reference/eslint-plugin-react-hooks/lints/globals) | `"error"` | enabled |
142
+ | [react-hooks/immutability](https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability) | `"error"` | enabled |
143
+ | [react-hooks/refs](https://react.dev/reference/eslint-plugin-react-hooks/lints/refs) | `"error"` | enabled |
144
+ | [react-hooks/config](https://react.dev/reference/eslint-plugin-react-hooks/lints/config) | `"error"` | opt-in: react.compiler |
145
+ | [react-hooks/gating](https://react.dev/reference/eslint-plugin-react-hooks/lints/gating) | `"error"` | opt-in: react.compiler |
146
+ | [react-hooks/incompatible-library](https://react.dev/reference/eslint-plugin-react-hooks/lints/incompatible-library) | `"error"` | opt-in: react.compiler |
147
+ | [react-hooks/preserve-manual-memoization](https://react.dev/reference/eslint-plugin-react-hooks/lints/preserve-manual-memoization) | `"error"` | opt-in: react.compiler |
148
+ ## react-a11y
149
+
150
+ | Rule | Exact researched value | Disposition |
151
+ | --- | --- | --- |
152
+ | [jsx-a11y/alt-text](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/alt-text.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
153
+ | [jsx-a11y/anchor-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/anchor-has-content.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
154
+ | [jsx-a11y/anchor-is-valid](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/anchor-is-valid.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
155
+ | [jsx-a11y/aria-activedescendant-has-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-activedescendant-has-tabindex.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
156
+ | [jsx-a11y/aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-props.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
157
+ | [jsx-a11y/aria-proptypes](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-proptypes.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
158
+ | [jsx-a11y/aria-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-role.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
159
+ | [jsx-a11y/aria-unsupported-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-unsupported-elements.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
160
+ | [jsx-a11y/autocomplete-valid](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/autocomplete-valid.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
161
+ | [jsx-a11y/click-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/click-events-have-key-events.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
162
+ | [jsx-a11y/heading-has-content](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/heading-has-content.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
163
+ | [jsx-a11y/html-has-lang](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/html-has-lang.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
164
+ | [jsx-a11y/iframe-has-title](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/iframe-has-title.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
165
+ | [jsx-a11y/img-redundant-alt](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/img-redundant-alt.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
166
+ | [jsx-a11y/interactive-supports-focus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/interactive-supports-focus.md) | `["error",{"tabbable":["button","checkbox","link","progressbar","searchbox","slider","spinbutton","switch","textbox"]}]` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
167
+ | [jsx-a11y/label-has-associated-control](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/label-has-associated-control.md) | `["error",{"assert":"either","depth":3}]` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
168
+ | [jsx-a11y/media-has-caption](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/media-has-caption.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
169
+ | [jsx-a11y/mouse-events-have-key-events](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/mouse-events-have-key-events.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
170
+ | [jsx-a11y/no-access-key](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-access-key.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
171
+ | [jsx-a11y/no-autofocus](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-autofocus.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
172
+ | [jsx-a11y/no-distracting-elements](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-distracting-elements.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
173
+ | [jsx-a11y/no-interactive-element-to-noninteractive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-interactive-element-to-noninteractive-role.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
174
+ | [jsx-a11y/no-noninteractive-element-interactions](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-noninteractive-element-interactions.md) | `["error",{"body":["onError","onLoad"],"iframe":["onError","onLoad"],"img":["onError","onLoad"]}]` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
175
+ | [jsx-a11y/no-noninteractive-element-to-interactive-role](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-noninteractive-element-to-interactive-role.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
176
+ | [jsx-a11y/no-noninteractive-tabindex](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-noninteractive-tabindex.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
177
+ | [jsx-a11y/no-redundant-roles](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-redundant-roles.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
178
+ | [jsx-a11y/no-static-element-interactions](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-static-element-interactions.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
179
+ | [jsx-a11y/role-has-required-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/role-has-required-aria-props.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
180
+ | [jsx-a11y/role-supports-aria-props](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/role-supports-aria-props.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
181
+ | [jsx-a11y/scope](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/scope.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
182
+ | [jsx-a11y/tabindex-no-positive](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/tabindex-no-positive.md) | `"error"` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
183
+ | [jsx-a11y/control-has-associated-label](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/control-has-associated-label.md) | `["error",{"depth":3,"ignoreElements":["input","select","textarea"]}]` | disabled: JSX a11y ESLint 10 peer incompatibility (user instruction) |
184
+ ## vue
185
+
186
+ | Rule | Exact researched value | Disposition |
187
+ | --- | --- | --- |
188
+ | [vue/no-dupe-keys](https://eslint.vuejs.org/rules/no-dupe-keys.html) | `"error"` | enabled |
189
+ | [vue/no-v-html](https://eslint.vuejs.org/rules/no-v-html.html) | `"error"` | enabled |
190
+ | [vue/no-setup-props-reactivity-loss](https://eslint.vuejs.org/rules/no-setup-props-reactivity-loss.html) | `"error"` | enabled |
191
+ | [vue/no-ref-object-reactivity-loss](https://eslint.vuejs.org/rules/no-ref-object-reactivity-loss.html) | `"error"` | enabled |
192
+ | [vue/no-mutating-props](https://eslint.vuejs.org/rules/no-mutating-props.html) | `["error",{"shallowOnly":false}]` | enabled |
193
+ | [vue/require-explicit-emits](https://eslint.vuejs.org/rules/require-explicit-emits.html) | `["error",{"allowProps":false}]` | enabled |
194
+ | [vue/require-explicit-slots](https://eslint.vuejs.org/rules/require-explicit-slots.html) | `"error"` | enabled |
195
+ | [vue/require-prop-types](https://eslint.vuejs.org/rules/require-prop-types.html) | `"error"` | enabled |
196
+ | [vue/no-undef-components](https://eslint.vuejs.org/rules/no-undef-components.html) | `["error",{"ignorePatterns":[]}]` | enabled |
197
+ | [vue/no-undef-directives](https://eslint.vuejs.org/rules/no-undef-directives.html) | `["error",{"ignore":[]}]` | enabled |
198
+ | [vue/no-unused-emit-declarations](https://eslint.vuejs.org/rules/no-unused-emit-declarations.html) | `"error"` | enabled |
199
+ | [vue/html-button-has-type](https://eslint.vuejs.org/rules/html-button-has-type.html) | `["error",{"button":true,"submit":true,"reset":true}]` | enabled |
200
+ | [vue/no-template-target-blank](https://eslint.vuejs.org/rules/no-template-target-blank.html) | `["error",{"allowReferrer":false,"enforceDynamicLinks":"always"}]` | enabled |
201
+ | [vue/eqeqeq](https://eslint.vuejs.org/rules/eqeqeq.html) | `["error","always"]` | enabled |
202
+ | [vue/max-lines-per-block](https://eslint.vuejs.org/rules/max-lines-per-block.html) | `["error",{"script":200,"template":200,"style":150,"skipBlankLines":true}]` | enabled |
203
+ | [vue/max-template-depth](https://eslint.vuejs.org/rules/max-template-depth.html) | `["error",{"maxDepth":5}]` | enabled |
204
+ | [vue/max-len](https://eslint.vuejs.org/rules/max-len.html) | `["error",{"code":120,"template":120,"comments":120,"tabWidth":2,"ignoreUrls":true,"ignoreStrings":false,"ignoreTemplateLiterals":false,"ignoreRegExpLiterals":false,"ignoreHTMLAttributeValues":false,"ignoreHTMLTextContents":false}]` | enabled |
205
+ | [vue/array-bracket-newline](https://eslint.vuejs.org/rules/array-bracket-newline.html) | `["error",{"multiline":true}]` | replaced: ztd/array-layout (full researched policy) |
206
+ | [vue/array-element-newline](https://eslint.vuejs.org/rules/array-element-newline.html) | `["error",{"ArrayExpression":{"minItems":3,"multiline":true,"consistent":true},"ArrayPattern":"consistent"}]` | replaced: ztd/array-layout (full researched policy) |
207
+ | [vue/no-template-shadow](https://eslint.vuejs.org/rules/no-template-shadow.html) | `"error"` | enabled |
208
+ | [vue/one-component-per-file](https://eslint.vuejs.org/rules/one-component-per-file.html) | `"error"` | enabled |
209
+ | [vue/no-required-prop-with-default](https://eslint.vuejs.org/rules/no-required-prop-with-default.html) | `"error"` | enabled |
210
+ | [vue/html-end-tags](https://eslint.vuejs.org/rules/html-end-tags.html) | `"error"` | enabled |
211
+ | [vue/no-async-in-computed-properties](https://eslint.vuejs.org/rules/no-async-in-computed-properties.html) | `"error"` | enabled |
212
+ | [vue/no-side-effects-in-computed-properties](https://eslint.vuejs.org/rules/no-side-effects-in-computed-properties.html) | `"error"` | enabled |
213
+ | [vue/no-use-v-if-with-v-for](https://eslint.vuejs.org/rules/no-use-v-if-with-v-for.html) | `"error"` | enabled |
214
+ | [vue/require-v-for-key](https://eslint.vuejs.org/rules/require-v-for-key.html) | `"error"` | enabled |
215
+ | [vue/no-watch-after-await](https://eslint.vuejs.org/rules/no-watch-after-await.html) | `"error"` | enabled |
216
+ | [vue/no-lifecycle-after-await](https://eslint.vuejs.org/rules/no-lifecycle-after-await.html) | `"error"` | enabled |
217
+ | [vue/no-expose-after-await](https://eslint.vuejs.org/rules/no-expose-after-await.html) | `"error"` | enabled |
218
+ ## vue-a11y
219
+
220
+ | Rule | Exact researched value | Disposition |
221
+ | --- | --- | --- |
222
+ | [vue-a11y/alt-text](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/alt-text.html) | `"error"` | enabled |
223
+ | [vue-a11y/anchor-has-content](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/anchor-has-content.html) | `"error"` | enabled |
224
+ | [vue-a11y/aria-props](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/aria-props.html) | `"error"` | enabled |
225
+ | [vue-a11y/aria-role](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/aria-role.html) | `"error"` | enabled |
226
+ | [vue-a11y/aria-unsupported-elements](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/aria-unsupported-elements.html) | `"error"` | enabled |
227
+ | [vue-a11y/click-events-have-key-events](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/click-events-have-key-events.html) | `"error"` | enabled |
228
+ | [vue-a11y/form-control-has-label](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/form-control-has-label.html) | `"error"` | enabled |
229
+ | [vue-a11y/heading-has-content](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/heading-has-content.html) | `"error"` | enabled |
230
+ | [vue-a11y/iframe-has-title](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/iframe-has-title.html) | `"error"` | enabled |
231
+ | [vue-a11y/interactive-supports-focus](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/interactive-supports-focus.html) | `"error"` | enabled |
232
+ | [vue-a11y/label-has-for](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/label-has-for.html) | `["error",{"required":{"some":["nesting","id"]},"allowChildren":false}]` | enabled |
233
+ | [vue-a11y/media-has-caption](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/media-has-caption.html) | `"error"` | enabled |
234
+ | [vue-a11y/mouse-events-have-key-events](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/mouse-events-have-key-events.html) | `"error"` | enabled |
235
+ | [vue-a11y/no-access-key](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/no-access-key.html) | `"error"` | enabled |
236
+ | [vue-a11y/no-aria-hidden-on-focusable](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/no-aria-hidden-on-focusable.html) | `"error"` | enabled |
237
+ | [vue-a11y/no-autofocus](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/no-autofocus.html) | `"error"` | enabled |
238
+ | [vue-a11y/no-distracting-elements](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/no-distracting-elements.html) | `"error"` | enabled |
239
+ | [vue-a11y/no-redundant-roles](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/no-redundant-roles.html) | `"error"` | enabled |
240
+ | [vue-a11y/no-role-presentation-on-focusable](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/no-role-presentation-on-focusable.html) | `"error"` | enabled |
241
+ | [vue-a11y/no-static-element-interactions](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/no-static-element-interactions.html) | `"error"` | enabled |
242
+ | [vue-a11y/role-has-required-aria-props](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/role-has-required-aria-props.html) | `"error"` | enabled |
243
+ | [vue-a11y/tabindex-no-positive](https://vue-a11y.github.io/eslint-plugin-vuejs-accessibility/rules/tabindex-no-positive.html) | `"error"` | enabled |
244
+ ## tests
245
+
246
+ | Rule | Exact researched value | Disposition |
247
+ | --- | --- | --- |
248
+ | [test/valid-expect](https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/valid-expect.md) | `["error",{"alwaysAwait":true,"minArgs":1,"maxArgs":1}]` | enabled |
249
+ | [test/no-conditional-expect](https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-conditional-expect.md) | `["error",{"expectAssertions":false}]` | enabled |
250
+ | [test/no-conditional-tests](https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-conditional-tests.md) | `"error"` | enabled |
251
+ | [test/no-disabled-tests](https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/no-disabled-tests.md) | `"error"` | enabled |
252
+ | [test/expect-expect](https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/expect-expect.md) | `["error",{"assertFunctionNames":["expect","assert"],"additionalTestBlockFunctions":[]}]` | enabled |
253
+ | [test/unbound-method](https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/unbound-method.md) | `["error",{"ignoreStatic":false}]` | enabled |
package/package.json CHANGED
@@ -1,6 +1,58 @@
1
1
  {
2
2
  "name": "@ztd-me/eslint",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Strict typed ESLint flat configs for TypeScript, React and Vue, built on antfu",
6
+ "license": "UNLICENSED",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/zeithrold/tools.git",
10
+ "directory": "packages/eslint-config"
11
+ },
12
+ "engines": {
13
+ "node": ">=22.14.0"
14
+ },
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "docs",
24
+ "README.md"
25
+ ],
26
+ "publishConfig": {
27
+ "access": "public",
28
+ "registry": "https://registry.npmjs.org/"
29
+ },
30
+ "peerDependencies": {
31
+ "eslint": "^10.11.0",
32
+ "typescript": ">=5.4.0 <6.1.0"
33
+ },
34
+ "dependencies": {
35
+ "@antfu/eslint-config": "9.5.1",
36
+ "@eslint-react/eslint-plugin": "5.23.3",
37
+ "eslint-plugin-react-hooks": "7.1.1",
38
+ "eslint-plugin-react-refresh": "0.5.7",
39
+ "eslint-plugin-sonarjs": "4.2.2",
40
+ "eslint-plugin-vuejs-accessibility": "2.6.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/estree": "1.0.8",
44
+ "@types/node": "24.12.0",
45
+ "@types/react": "19.2.14",
46
+ "eslint": "10.11.0",
47
+ "react": "19.2.4",
48
+ "typescript": "6.0.3"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc -p tsconfig.build.json",
52
+ "typecheck": "tsc -p tsconfig.build.json --noEmit && tsc -p test/types/tsconfig.json",
53
+ "lint": "eslint src test scripts eslint.config.js --max-warnings 0",
54
+ "test": "pnpm run build && node --test test/*.test.mjs",
55
+ "test:pack": "node scripts/pack-smoke.mjs",
56
+ "check": "pnpm run build && pnpm run typecheck && pnpm run lint && pnpm test && pnpm run test:pack"
57
+ }
6
58
  }