lint-suite 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +161 -16
  2. package/eslint.cjs +3085 -998
  3. package/eslint.cjs.map +4 -4
  4. package/eslint.d.ts +13 -13
  5. package/eslint.d.ts.map +1 -1
  6. package/eslint.js +3173 -990
  7. package/eslint.js.map +4 -4
  8. package/lib/angular-template.d.ts.map +1 -1
  9. package/lib/angular.d.ts +1 -0
  10. package/lib/angular.d.ts.map +1 -1
  11. package/lib/base-limits.d.ts +2 -0
  12. package/lib/base-limits.d.ts.map +1 -0
  13. package/lib/base-practices.d.ts +2 -0
  14. package/lib/base-practices.d.ts.map +1 -0
  15. package/lib/base-recommended.d.ts +2 -0
  16. package/lib/base-recommended.d.ts.map +1 -0
  17. package/lib/base.d.ts.map +1 -1
  18. package/lib/javascript.d.ts.map +1 -1
  19. package/lib/rules/define-plugin.util.d.ts +6 -0
  20. package/lib/rules/define-plugin.util.d.ts.map +1 -0
  21. package/lib/rules/explicit-accessibility/common/explicit-accessibility.const.d.ts +6 -0
  22. package/lib/rules/explicit-accessibility/common/explicit-accessibility.const.d.ts.map +1 -0
  23. package/lib/rules/explicit-accessibility/common/explicit-accessibility.type.d.ts +14 -0
  24. package/lib/rules/explicit-accessibility/common/explicit-accessibility.type.d.ts.map +1 -0
  25. package/lib/rules/explicit-accessibility/explicit-accessibility.d.ts +7 -0
  26. package/lib/rules/explicit-accessibility/explicit-accessibility.d.ts.map +1 -0
  27. package/lib/rules/no-inline-object-types/no-inline-object-types.d.ts +6 -0
  28. package/lib/rules/no-inline-object-types/no-inline-object-types.d.ts.map +1 -0
  29. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-component-discovery.d.ts +5 -0
  30. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-component-discovery.d.ts.map +1 -0
  31. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-component-scope.d.ts +9 -0
  32. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-component-scope.d.ts.map +1 -0
  33. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-decorator-kind.d.ts +10 -0
  34. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-decorator-kind.d.ts.map +1 -0
  35. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-directive-index.d.ts +4 -0
  36. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-directive-index.d.ts.map +1 -0
  37. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-metadata-values.d.ts +12 -0
  38. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-metadata-values.d.ts.map +1 -0
  39. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-resolved-path.d.ts +3 -0
  40. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-resolved-path.d.ts.map +1 -0
  41. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-template-read-chains.d.ts +17 -0
  42. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-template-read-chains.d.ts.map +1 -0
  43. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-template-read-resolution.d.ts +8 -0
  44. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-template-read-resolution.d.ts.map +1 -0
  45. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-template-reads.d.ts +6 -0
  46. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-template-reads.d.ts.map +1 -0
  47. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-template-references.d.ts +5 -0
  48. package/lib/rules/no-unused-angular-instance-fields/project-usage/angular/angular-template-references.d.ts.map +1 -0
  49. package/lib/rules/no-unused-angular-instance-fields/project-usage/common/project-index.type.d.ts +54 -0
  50. package/lib/rules/no-unused-angular-instance-fields/project-usage/common/project-index.type.d.ts.map +1 -0
  51. package/lib/rules/no-unused-angular-instance-fields/project-usage/common/project-usage.type.d.ts +116 -0
  52. package/lib/rules/no-unused-angular-instance-fields/project-usage/common/project-usage.type.d.ts.map +1 -0
  53. package/lib/rules/no-unused-angular-instance-fields/project-usage/project-file-entry.d.ts +4 -0
  54. package/lib/rules/no-unused-angular-instance-fields/project-usage/project-file-entry.d.ts.map +1 -0
  55. package/lib/rules/no-unused-angular-instance-fields/project-usage/project-index-classes.d.ts +4 -0
  56. package/lib/rules/no-unused-angular-instance-fields/project-usage/project-index-classes.d.ts.map +1 -0
  57. package/lib/rules/no-unused-angular-instance-fields/project-usage/project-index-reconciliation.d.ts +4 -0
  58. package/lib/rules/no-unused-angular-instance-fields/project-usage/project-index-reconciliation.d.ts.map +1 -0
  59. package/lib/rules/no-unused-angular-instance-fields/project-usage/project-index-staleness.d.ts +10 -0
  60. package/lib/rules/no-unused-angular-instance-fields/project-usage/project-index-staleness.d.ts.map +1 -0
  61. package/lib/rules/no-unused-angular-instance-fields/project-usage/project-usage.d.ts +17 -0
  62. package/lib/rules/no-unused-angular-instance-fields/project-usage/project-usage.d.ts.map +1 -0
  63. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-angular-interface-methods.d.ts +8 -0
  64. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-angular-interface-methods.d.ts.map +1 -0
  65. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-assignment-pattern-elements.d.ts +5 -0
  66. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-assignment-pattern-elements.d.ts.map +1 -0
  67. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-binding-pattern-elements.d.ts +6 -0
  68. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-binding-pattern-elements.d.ts.map +1 -0
  69. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-candidate-names.d.ts +4 -0
  70. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-candidate-names.d.ts.map +1 -0
  71. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-destructuring-reads.d.ts +4 -0
  72. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-destructuring-reads.d.ts.map +1 -0
  73. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-reads.d.ts +4 -0
  74. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-reads.d.ts.map +1 -0
  75. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-symbol-reads.d.ts +8 -0
  76. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-symbol-reads.d.ts.map +1 -0
  77. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-type-dependencies.d.ts +3 -0
  78. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-type-dependencies.d.ts.map +1 -0
  79. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-write-targets.d.ts +7 -0
  80. package/lib/rules/no-unused-angular-instance-fields/project-usage/typescript/typescript-write-targets.d.ts.map +1 -0
  81. package/lib/rules/no-unused-angular-instance-fields/project-usage/utils/read-chain-text.util.d.ts +4 -0
  82. package/lib/rules/no-unused-angular-instance-fields/project-usage/utils/read-chain-text.util.d.ts.map +1 -0
  83. package/lib/rules/no-unused-angular-instance-fields/project-usage/utils/spec-file.util.d.ts +2 -0
  84. package/lib/rules/no-unused-angular-instance-fields/project-usage/utils/spec-file.util.d.ts.map +1 -0
  85. package/lib/rules/no-unused-angular-instance-fields/project-usage/utils/type-property-symbols.util.d.ts +4 -0
  86. package/lib/rules/no-unused-angular-instance-fields/project-usage/utils/type-property-symbols.util.d.ts.map +1 -0
  87. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-class-fields.d.ts +3 -0
  88. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-class-fields.d.ts.map +1 -0
  89. package/lib/rules/no-unused-angular-instance-fields/{utils/angular-expression-reads.util.d.ts → rule/angular/angular-expression-reads.d.ts} +1 -1
  90. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-expression-reads.d.ts.map +1 -0
  91. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-imports.d.ts +9 -0
  92. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-imports.d.ts.map +1 -0
  93. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-managed-fields.d.ts +5 -0
  94. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-managed-fields.d.ts.map +1 -0
  95. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-member-candidates.d.ts +6 -0
  96. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-member-candidates.d.ts.map +1 -0
  97. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-metadata-literals.d.ts +5 -0
  98. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-metadata-literals.d.ts.map +1 -0
  99. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-metadata-reads.d.ts +9 -0
  100. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-metadata-reads.d.ts.map +1 -0
  101. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-template-parsing.d.ts +4 -0
  102. package/lib/rules/no-unused-angular-instance-fields/rule/angular/angular-template-parsing.d.ts.map +1 -0
  103. package/lib/rules/no-unused-angular-instance-fields/rule/common/no-unused-angular-instance-fields.type.d.ts +54 -0
  104. package/lib/rules/no-unused-angular-instance-fields/rule/common/no-unused-angular-instance-fields.type.d.ts.map +1 -0
  105. package/lib/rules/no-unused-angular-instance-fields/rule/no-unused-angular-instance-fields.d.ts +8 -0
  106. package/lib/rules/no-unused-angular-instance-fields/rule/no-unused-angular-instance-fields.d.ts.map +1 -0
  107. package/lib/rules/no-unused-angular-instance-fields/rule/typescript/typescript-class-read-visitor.d.ts +4 -0
  108. package/lib/rules/no-unused-angular-instance-fields/rule/typescript/typescript-class-read-visitor.d.ts.map +1 -0
  109. package/lib/rules/no-unused-angular-instance-fields/rule/typescript/typescript-field-reads.d.ts +8 -0
  110. package/lib/rules/no-unused-angular-instance-fields/rule/typescript/typescript-field-reads.d.ts.map +1 -0
  111. package/lib/rules/no-unused-angular-instance-fields/rule/typescript/typescript-lexical-this.d.ts +3 -0
  112. package/lib/rules/no-unused-angular-instance-fields/rule/typescript/typescript-lexical-this.d.ts.map +1 -0
  113. package/lib/rules/no-unused-angular-instance-fields/rule/typescript/typescript-write-targets.d.ts +3 -0
  114. package/lib/rules/no-unused-angular-instance-fields/rule/typescript/typescript-write-targets.d.ts.map +1 -0
  115. package/lib/rules/no-unused-angular-instance-fields/utils/angular-read-target.util.d.ts +4 -0
  116. package/lib/rules/no-unused-angular-instance-fields/utils/angular-read-target.util.d.ts.map +1 -0
  117. package/lib/rules/readonly-type-properties/readonly-type-properties.d.ts +6 -0
  118. package/lib/rules/readonly-type-properties/readonly-type-properties.d.ts.map +1 -0
  119. package/lib/typescript-consistency.d.ts +2 -0
  120. package/lib/typescript-consistency.d.ts.map +1 -0
  121. package/lib/typescript-imports.d.ts +2 -0
  122. package/lib/typescript-imports.d.ts.map +1 -0
  123. package/lib/typescript-local-plugin.d.ts +2 -0
  124. package/lib/typescript-local-plugin.d.ts.map +1 -0
  125. package/lib/typescript-overrides.d.ts +2 -0
  126. package/lib/typescript-overrides.d.ts.map +1 -0
  127. package/lib/typescript-recommended.d.ts +2 -0
  128. package/lib/typescript-recommended.d.ts.map +1 -0
  129. package/lib/typescript-safety.d.ts +2 -0
  130. package/lib/typescript-safety.d.ts.map +1 -0
  131. package/lib/typescript.d.ts +1 -0
  132. package/lib/typescript.d.ts.map +1 -1
  133. package/package.json +18 -14
  134. package/lib/rules/explicit-accessibility.d.ts +0 -12
  135. package/lib/rules/explicit-accessibility.d.ts.map +0 -1
  136. package/lib/rules/no-unused-angular-instance-fields/angular-class-fields.d.ts +0 -8
  137. package/lib/rules/no-unused-angular-instance-fields/angular-class-fields.d.ts.map +0 -1
  138. package/lib/rules/no-unused-angular-instance-fields/angular-metadata-reads.d.ts +0 -3
  139. package/lib/rules/no-unused-angular-instance-fields/angular-metadata-reads.d.ts.map +0 -1
  140. package/lib/rules/no-unused-angular-instance-fields/common/no-unused-angular-instance-fields.type.d.ts +0 -10
  141. package/lib/rules/no-unused-angular-instance-fields/common/no-unused-angular-instance-fields.type.d.ts.map +0 -1
  142. package/lib/rules/no-unused-angular-instance-fields/no-unused-angular-instance-fields.d.ts +0 -7
  143. package/lib/rules/no-unused-angular-instance-fields/no-unused-angular-instance-fields.d.ts.map +0 -1
  144. package/lib/rules/no-unused-angular-instance-fields/no-unused-instance-fields.spec.d.ts +0 -2
  145. package/lib/rules/no-unused-angular-instance-fields/no-unused-instance-fields.spec.d.ts.map +0 -1
  146. package/lib/rules/no-unused-angular-instance-fields/utils/angular-expression-reads.util.d.ts.map +0 -1
  147. package/lib/rules/no-unused-angular-instance-fields/utils/typescript-field-reads.util.d.ts +0 -7
  148. package/lib/rules/no-unused-angular-instance-fields/utils/typescript-field-reads.util.d.ts.map +0 -1
package/README.md CHANGED
@@ -62,7 +62,13 @@ export default [
62
62
  `recommended` is intentionally framework-agnostic — it ships only the language + architecture + format baseline (`base`, `javascript`, `typescript`, `json`, `boundaries`, `prettier`). Add the framework/tooling configs your project actually uses:
63
63
 
64
64
  ```js
65
- import { recommended, angular, angularTemplate, rxjs, vitest } from 'lint-suite/eslint';
65
+ import {
66
+ recommended,
67
+ angular,
68
+ angularTemplate,
69
+ rxjs,
70
+ vitest
71
+ } from 'lint-suite/eslint';
66
72
 
67
73
  export default [
68
74
  ...recommended,
@@ -77,21 +83,28 @@ export default [
77
83
 
78
84
  ## Available Configurations
79
85
 
80
- | Configuration | Description |
81
- | ------------------- | -------------------------------------------------------- |
82
- | `base` | Core JavaScript rules, formatting, and complexity limits |
83
- | `javascript` | JavaScript-specific rules via `@nx/eslint-plugin` |
84
- | `typescript` | TypeScript strict typing, imports, and naming conventions |
85
- | `angular` | Angular component best practices with Signal support |
86
- | `angularTemplate` | HTML template rules with accessibility and performance |
87
- | `rxjs` | Observable patterns, operator safety, and subscriptions |
88
- | `vitest` | Vitest testing rules and matcher improvements |
89
- | `playwright` | Playwright e2e locator and matcher best practices |
90
- | `json` | JSON linting with comment support for tsconfig/vscode |
91
- | `storybook` | Storybook CSF enforcement |
92
- | `boundaries` | Module boundary rules (feature, data-access, ui, etc.) |
93
- | `prettier` | Disables rules that conflict with Prettier (use last) |
94
- | **`recommended`** | **Baseline only: `base` + `javascript` + `typescript` + `json` + `boundaries` + `prettier` — compose the rest on top** |
86
+ | Configuration | Description |
87
+ | ------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
88
+ | `base` | Core JavaScript rules, formatting, and complexity limits |
89
+ | `javascript` | JavaScript-specific rules via `@nx/eslint-plugin` |
90
+ | `typescript` | TypeScript strict typing, imports, and naming conventions |
91
+ | `angular` | Angular component best practices with Signal support |
92
+ | `angularTemplate` | HTML template rules with accessibility and performance |
93
+ | `rxjs` | Observable patterns, operator safety, and subscriptions |
94
+ | `vitest` | Vitest testing rules and matcher improvements |
95
+ | `playwright` | Playwright e2e locator and matcher best practices |
96
+ | `json` | JSON linting with comment support for tsconfig/vscode |
97
+ | `storybook` | Storybook CSF enforcement |
98
+ | `boundaries` | Module boundary rules (feature, data-access, ui, etc.) |
99
+ | `prettier` | Disables rules that conflict with Prettier (use last) |
100
+ | **`recommended`** | **Baseline only: `base` + `javascript` + `typescript` + `json` + `boundaries` + `prettier` — compose the rest on top** |
101
+ | **Angular project analysis:** The `angular` preset enables `projectService: true` and project analysis for |
102
+ | `lint-suite-angular/no-unused-instance-fields`. It counts exact reads in the configured TypeScript/Angular |
103
+ | Program, including external parent templates/TypeScript, subclasses, and Angular interface implementations; |
104
+ | code outside that Program is unknowable. Project mode also reports unused public/protected directive members. |
105
+ | Direct rule usage remains local by default, and `allowEffectFields` is opt-in. After cross-file or template |
106
+ | changes, do not use ESLint `--cache` for correctness gates; run a full non-cached lint (for example, |
107
+ | `eslint --no-cache`). |
95
108
 
96
109
  ## Customization
97
110
 
@@ -111,6 +124,138 @@ export default [
111
124
  ];
112
125
  ```
113
126
 
127
+ ### Unused Angular instance fields
128
+
129
+ The `angular` config enables `lint-suite-angular/no-unused-instance-fields`.
130
+ Local analysis recognizes reads from the class, component template, and host
131
+ expressions. Use project analysis when other TypeScript files or Angular
132
+ templates can read a component or directive member:
133
+
134
+ ```js
135
+ {
136
+ files: ['**/*.ts'],
137
+ languageOptions: {
138
+ parserOptions: {
139
+ projectService: true,
140
+ tsconfigRootDir: import.meta.dirname
141
+ }
142
+ },
143
+ rules: {
144
+ 'lint-suite-angular/no-unused-instance-fields': [
145
+ 'error',
146
+ {
147
+ analysis: 'project',
148
+ allowEffectFields: true
149
+ }
150
+ ]
151
+ }
152
+ }
153
+ ```
154
+
155
+ - `analysis` defaults to `'local'`. Project mode excludes spec-file reads. A
156
+ file it cannot index exactly (a template that does not parse, metadata it
157
+ cannot evaluate, a read it cannot type) falls back to name matching for
158
+ that file only: every member whose name that file mentions counts as read.
159
+ Set `LINT_SUITE_DEBUG=1` to print which files fell back and why, for
160
+ example `LINT_SUITE_DEBUG=1 eslint --no-cache src/app/some.component.ts`.
161
+ - `allowEffectFields` defaults to `false`. When enabled, fields holding
162
+ auto-cleaned Angular `effect()` calls are allowed; effects configured with
163
+ `manualCleanup: true` must still be read.
164
+ - Angular signal inputs, models, outputs, and query fields are always treated
165
+ as framework-managed.
166
+ - Fields typed with `ComponentRef` imported from `@angular/core` are excluded
167
+ from unused-field reports.
168
+ - In local mode, non-private members of `abstract` components and directives
169
+ are exempt: subclasses that read them live in other files. Project mode
170
+ resolves those subclass reads and reports the members normally.
171
+ - Project analysis is incremental. The index is kept per tsconfig; when an
172
+ editor hands the rule a changed Program after a save, only the saved file and
173
+ the files whose reads depended on it are re-indexed, so feedback stays fast
174
+ in large workspaces. Template references (`#ref`, `#ref="exportAs"`) resolve
175
+ within a standalone component's `imports`; when that scope cannot be
176
+ determined statically (NgModule declarations, `hostDirectives`, spreads),
177
+ every matching component or directive in the Program is a candidate. Extra
178
+ candidates can only add reads. Metadata strings may be constants.
179
+
180
+ ### Explicit accessibility
181
+
182
+ The `typescript` preset enables `local/explicit-accessibility`, which reports
183
+ class members (fields, methods, accessors, abstract members, and constructor
184
+ parameter properties) without an explicit `public`, `private`, or `protected`
185
+ modifier. `#private` members are ignored: TypeScript forbids a modifier there.
186
+
187
+ ```js
188
+ {
189
+ rules: {
190
+ 'local/explicit-accessibility': [
191
+ 'error',
192
+ { defaultAccessibility: 'private' }
193
+ ]
194
+ }
195
+ }
196
+ ```
197
+
198
+ - `defaultAccessibility` defaults to `public` and drives `eslint --fix`; the
199
+ IDE offers the other two levels as suggestions.
200
+ - `defaultAccessibility: 'none'` reports without an auto-fix and offers all
201
+ three levels as suggestions.
202
+ - Constructors are always fixed to `public`. A private constructor breaks
203
+ `new` and dependency injection.
204
+ - The fix does not default to `private` because members implementing an
205
+ interface or read by an Angular template must stay non-private, and the
206
+ rule cannot see either.
207
+
208
+ ### Readonly type properties
209
+
210
+ The `typescript` preset enables `local/readonly-type-properties`, which
211
+ reports primitive-typed properties in `type` aliases, interfaces, and
212
+ inline object types that are not marked `readonly`, and auto-fixes them
213
+ with `eslint --fix`. A property is primitive-typed when its annotation is
214
+ `string`, `number`, `boolean`, `bigint`, `symbol`, `null`, `undefined`, a
215
+ literal or template-literal type, or a union/intersection of those.
216
+
217
+ ```ts
218
+ // Before
219
+ type User = { name: string; roles: string[]; profile: Profile };
220
+
221
+ // After --fix
222
+ type User = { readonly name: string; roles: string[]; profile: Profile };
223
+ ```
224
+
225
+ - Arrays, object types, type references (including string-union aliases
226
+ like `Status`), functions, and tuples are left untouched because the
227
+ rule is syntactic and does not resolve types.
228
+ - Index signatures, mapped types, and method signatures are out of scope.
229
+ - Use `// eslint-disable-next-line local/readonly-type-properties` when a
230
+ property genuinely needs to stay mutable.
231
+
232
+ ### No inline object types
233
+
234
+ The `typescript` preset enables `local/no-inline-object-types`, which
235
+ reports object type literals nested inside a `type NAME = ...` alias
236
+ declaration (nested properties, array element types, union members,
237
+ intersection members, and generic arguments such as `Readonly<{...}>`).
238
+ It is not auto-fixable: extracting an inline object type requires
239
+ choosing a name.
240
+
241
+ ```ts
242
+ // Before
243
+ type LineItem = { readonly name: string; readonly item: { readonly id: string } };
244
+
245
+ // After
246
+ type Item = { readonly id: string };
247
+ type LineItem = { readonly name: string; readonly item: Item };
248
+ ```
249
+
250
+ - The direct body of a `type X = {...}` alias is allowed to be an object
251
+ literal; any object type literal nested inside that alias must reference
252
+ a named type instead.
253
+ - Positions outside a type alias — function parameters and return types,
254
+ `as`/`satisfies` expressions, generic call arguments, interface members,
255
+ and class members — are not checked by this rule.
256
+ - Declare the shape as `type Item = {...}` and reference it instead of
257
+ inlining the object type.
258
+
114
259
  ## Stylelint and Prettier presets
115
260
 
116
261
  These are standalone configs exported as subpaths — they are not part of the `recommended` ESLint array.