lint-suite 2.3.0 → 3.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.
Files changed (4) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +12 -13
  3. package/eslint.js +26 -26
  4. package/package.json +23 -23
package/CHANGELOG.md CHANGED
@@ -1,3 +1,30 @@
1
+ # 3.0.0 (2026-10-13)
2
+
3
+ ### 🧱 Updated Dependencies
4
+
5
+ - Updated eslint-arrow-fits-line to 1.0.0
6
+ - Updated eslint-chain-fits-line to 1.0.0
7
+ - Updated eslint-chain-receiver-name to 1.0.0
8
+ - Updated eslint-explicit-accessibility to 1.0.0
9
+ - Updated eslint-max-condition-operands to 1.0.0
10
+ - Updated eslint-modular-boundaries to 1.0.0
11
+ - Updated eslint-no-call-in-condition to 1.0.0
12
+ - Updated eslint-no-grouped-condition to 1.0.0
13
+ - Updated eslint-no-inline-object-types to 1.0.0
14
+ - Updated eslint-no-inline-return-object to 1.0.0
15
+ - Updated eslint-no-nested-object-value to 1.0.0
16
+ - Updated eslint-no-spread-expression to 1.0.0
17
+ - Updated eslint-no-unused-exports to 1.0.0
18
+ - Updated eslint-one-line-guard to 1.0.0
19
+ - Updated eslint-readonly-type-properties to 1.0.0
20
+ - Updated eslint-ternary-branch-shape to 1.0.0
21
+ - Updated eslint-test-file-shape to 1.0.0
22
+ - Updated eslint-type-placement to 1.0.0
23
+ - Updated eslint-util-purity to 1.0.0
24
+ - Updated eslint-no-unused-angular-fields to 1.0.0
25
+ - Updated eslint-no-unstyled-classes to 1.0.0
26
+ - Updated stylelint-no-unused-classes to 2.0.0
27
+
1
28
  ## 2.3.0 (2026-10-11)
2
29
 
3
30
  ### 🚀 Features
package/README.md CHANGED
@@ -24,7 +24,7 @@ The suite includes custom rules for TypeScript code structure, unused exports, u
24
24
  - **Prettier**: Automatic disabling of formatting rules that conflict with Prettier (`eslint-config-prettier`)
25
25
  - **Prettier config**: Standalone formatting preset (subpath `lint-suite/prettier`) with the suite's house defaults and Angular/HTML overrides
26
26
  - **Stylelint**: Standalone SCSS/CSS preset (subpath `lint-suite/stylelint`) with standard + recess-order + BEM selector enforcement and `lint-suite/no-unused-classes`
27
- - **Architecture**: Folder layer boundaries with `eslint-plugin-boundaries`, and workspace project boundaries by tag with `@lint-suite/eslint-plugin-modular-boundaries`
27
+ - **Architecture**: Folder layer boundaries with `eslint-plugin-boundaries`, and workspace project boundaries by tag with `@lint-suite/eslint-modular-boundaries`
28
28
  - **Additional Support**: JSON (with comment support for tsconfig), Storybook CSF enforcement
29
29
 
30
30
  ## Installation
@@ -40,11 +40,11 @@ Installing one does not install this umbrella or its unrelated presets.
40
40
  For example:
41
41
 
42
42
  ```bash
43
- pnpm add -D @lint-suite/eslint-plugin-arrow-body-fits-line eslint typescript typescript-eslint
43
+ pnpm add -D @lint-suite/eslint-arrow-fits-line eslint typescript typescript-eslint
44
44
  ```
45
45
 
46
46
  ```js
47
- import arrow from '@lint-suite/eslint-plugin-arrow-body-fits-line';
47
+ import arrow from '@lint-suite/eslint-arrow-fits-line';
48
48
  import tseslint from 'typescript-eslint';
49
49
 
50
50
  export default [
@@ -52,15 +52,14 @@ export default [
52
52
  files: ['**/*.ts'],
53
53
  languageOptions: { parser: tseslint.parser },
54
54
  plugins: { arrow },
55
- rules: { 'arrow/arrow-body-fits-line': 'error' }
55
+ rules: { 'arrow/arrow-fits-line': 'error' }
56
56
  }
57
57
  ];
58
58
  ```
59
59
 
60
60
  The [package catalog](https://github.com/F0rty-Tw0/lint-suite#standalone-custom-rules)
61
- lists every package and its rule key. The Angular instance-field package is
62
- `@lint-suite/eslint-plugin-no-unused-angular-instance-fields`; its rule key
63
- remains `no-unused-instance-fields`. The Stylelint package is
61
+ lists every package and its rule key. Each ESLint rule key matches its
62
+ package name without the `@lint-suite/eslint-` prefix. The Stylelint package is
64
63
  `@lint-suite/stylelint-no-unused-classes`, with rule ID
65
64
  `lint-suite/no-unused-classes`.
66
65
 
@@ -147,7 +146,7 @@ export default [
147
146
  | **`recommended`** | **Baseline only: `base` + `javascript` + `typescript` + `json` + `boundaries` + `prettier` — compose the rest on top** |
148
147
 
149
148
  **Angular project analysis:** The `angular` preset enables `projectService:
150
- true` and project analysis for `lint-suite-angular/no-unused-instance-fields`.
149
+ true` and project analysis for `lint-suite-angular/no-unused-angular-fields`.
151
150
  It counts exact reads in the configured TypeScript/Angular Program, including
152
151
  external parent templates/TypeScript, subclasses, and Angular interface
153
152
  implementations; code outside that Program is unknowable. Project mode also
@@ -195,7 +194,7 @@ export default [
195
194
  ### Workspace project boundaries
196
195
 
197
196
  The `boundaries` config enables `modular-boundaries/modular-boundaries` from
198
- [`@lint-suite/eslint-plugin-modular-boundaries`](https://github.com/F0rty-Tw0/lint-suite/tree/master/packages/eslint-plugin/modular-boundaries#readme).
197
+ [`@lint-suite/eslint-modular-boundaries`](https://github.com/F0rty-Tw0/lint-suite/tree/master/packages/eslint/modular-boundaries#readme).
199
198
  It reads pnpm, npm, Nx, Turborepo and moon workspace files and checks imports
200
199
  between workspace projects. Outside a workspace it does nothing.
201
200
 
@@ -246,7 +245,7 @@ other, unchanged files until they are linted again.
246
245
 
247
246
  ### Unused Angular instance fields
248
247
 
249
- The `angular` config enables `lint-suite-angular/no-unused-instance-fields`.
248
+ The `angular` config enables `lint-suite-angular/no-unused-angular-fields`.
250
249
  Project analysis is the default and recognizes reads from other TypeScript
251
250
  files and Angular templates. It requires parser services with type information:
252
251
 
@@ -260,7 +259,7 @@ files and Angular templates. It requires parser services with type information:
260
259
  }
261
260
  },
262
261
  rules: {
263
- 'lint-suite-angular/no-unused-instance-fields': [
262
+ 'lint-suite-angular/no-unused-angular-fields': [
264
263
  'error',
265
264
  {
266
265
  analysis: 'project',
@@ -573,9 +572,9 @@ offers an IDE suggestion with a placeholder name instead of an auto-fix.
573
572
  | `local/max-condition-operands` | An `if` condition with more than `max` (default 3) operands joined by `&&` / `\|\|`. | none |
574
573
  | `local/no-grouped-condition` | A parenthesised group with a different operator inside an `if` condition or a boolean `const` (`a && (b \|\| c)`). | Suggestion: hoist the group |
575
574
  | `local/ternary-branch-shape` | A ternary branch that is not a name, literal, template literal, or plain member access. | none |
576
- | `local/chain-receiver-is-name` | A member chain starting on an inline expression: `(a ?? b).x`, `{...}.x`, `[...].x`, `(await p).x`. | Suggestion: name the receiver |
575
+ | `local/chain-receiver-name` | A member chain starting on an inline expression: `(a ?? b).x`, `{...}.x`, `[...].x`, `(await p).x`. | Suggestion: name the receiver |
577
576
  | `local/chain-fits-line` | A chain of two or more calls whose `.method(` parts sit on different lines. A multi-line callback argument does not count. | none |
578
- | `local/arrow-body-fits-line` | An expression-bodied arrow whose body wraps onto more lines. | Fix: block body with `return` |
577
+ | `local/arrow-fits-line` | An expression-bodied arrow whose body wraps onto more lines. | Fix: block body with `return` |
579
578
  | `local/no-nested-object-value` | A property value that is a non-empty object literal, an array holding object literals, a ternary, or a call chain. Decorator arguments (`@Component({...})`) and files matching `configFiles` (default `**/*.config.*`, `**/eslint.config.*`, `**/*.schema.ts`) are exempt. | Suggestion: hoist to a `const` |
580
579
  | `local/no-spread-expression` | `...(expr)` where the argument is not a name or member access. | Suggestion: hoist to a `const` |
581
580
  | `local/no-inline-return-object` | `return {...}` and `=> ({...})`. | Suggestion: `const result = {...}; return result;` |
package/eslint.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // packages/lint-suite/src/lib/angular-template.ts
2
- import lintSuiteAngularTemplatePlugin from "@lint-suite/eslint-plugin-no-unstyled-classes";
2
+ import lintSuiteAngularTemplatePlugin from "@lint-suite/eslint-no-unstyled-classes";
3
3
  import { configs } from "angular-eslint";
4
4
  import { defineConfig } from "eslint/config";
5
5
  var angularTemplate = defineConfig([
@@ -88,7 +88,7 @@ var angularTemplate = defineConfig([
88
88
  ]);
89
89
 
90
90
  // packages/lint-suite/src/lib/angular.ts
91
- import noUnusedAngularInstanceFieldPlugin from "@lint-suite/eslint-plugin-no-unused-angular-instance-fields";
91
+ import noUnusedAngularInstanceFieldPlugin from "@lint-suite/eslint-no-unused-angular-fields";
92
92
  import { configs as configs2, processInlineTemplates } from "angular-eslint";
93
93
  import { defineConfig as defineConfig2 } from "eslint/config";
94
94
  import globals from "globals";
@@ -118,7 +118,7 @@ var angular = defineConfig2([
118
118
  // are dead.
119
119
  // Bad: private unused = 1; read nowhere
120
120
  // Good: delete it, or read it in the template
121
- "lint-suite-angular/no-unused-instance-fields": [
121
+ "lint-suite-angular/no-unused-angular-fields": [
122
122
  "error",
123
123
  { analysis: "project" }
124
124
  ],
@@ -403,7 +403,7 @@ var base = defineConfig6([
403
403
  ]);
404
404
 
405
405
  // packages/lint-suite/src/lib/boundaries.ts
406
- import modularBoundariesPlugin from "@lint-suite/eslint-plugin-modular-boundaries";
406
+ import modularBoundariesPlugin from "@lint-suite/eslint-modular-boundaries";
407
407
  import { defineConfig as defineConfig7 } from "eslint/config";
408
408
  import boundariesPlugin from "eslint-plugin-boundaries";
409
409
  var boundaries = defineConfig7([
@@ -900,29 +900,29 @@ var typescriptRecommended = defineConfig17([
900
900
  import { defineConfig as defineConfig18 } from "eslint/config";
901
901
 
902
902
  // packages/lint-suite/src/lib/typescript-local-plugin.ts
903
- import { arrowBodyFitsLineRule } from "@lint-suite/eslint-plugin-arrow-body-fits-line";
904
- import { chainFitsLineRule } from "@lint-suite/eslint-plugin-chain-fits-line";
905
- import { chainReceiverIsNameRule } from "@lint-suite/eslint-plugin-chain-receiver-is-name";
906
- import { explicitAccessibilityRule } from "@lint-suite/eslint-plugin-explicit-accessibility";
907
- import { maxConditionOperandsRule } from "@lint-suite/eslint-plugin-max-condition-operands";
908
- import { noCallInConditionRule } from "@lint-suite/eslint-plugin-no-call-in-condition";
909
- import { noGroupedConditionRule } from "@lint-suite/eslint-plugin-no-grouped-condition";
910
- import { noInlineObjectTypesRule } from "@lint-suite/eslint-plugin-no-inline-object-types";
911
- import { noInlineReturnObjectRule } from "@lint-suite/eslint-plugin-no-inline-return-object";
912
- import { noNestedObjectValueRule } from "@lint-suite/eslint-plugin-no-nested-object-value";
913
- import { noSpreadExpressionRule } from "@lint-suite/eslint-plugin-no-spread-expression";
914
- import { noUnusedExportsRule } from "@lint-suite/eslint-plugin-no-unused-exports";
915
- import { oneLineGuardRule } from "@lint-suite/eslint-plugin-one-line-guard";
916
- import { readonlyTypePropertiesRule } from "@lint-suite/eslint-plugin-readonly-type-properties";
917
- import { ternaryBranchShapeRule } from "@lint-suite/eslint-plugin-ternary-branch-shape";
918
- import { testFileShapeRule } from "@lint-suite/eslint-plugin-test-file-shape";
919
- import { typePlacementRule } from "@lint-suite/eslint-plugin-type-placement";
920
- import { utilPurityRule } from "@lint-suite/eslint-plugin-util-purity";
903
+ import { arrowFitsLineRule } from "@lint-suite/eslint-arrow-fits-line";
904
+ import { chainFitsLineRule } from "@lint-suite/eslint-chain-fits-line";
905
+ import { chainReceiverNameRule } from "@lint-suite/eslint-chain-receiver-name";
906
+ import { explicitAccessibilityRule } from "@lint-suite/eslint-explicit-accessibility";
907
+ import { maxConditionOperandsRule } from "@lint-suite/eslint-max-condition-operands";
908
+ import { noCallInConditionRule } from "@lint-suite/eslint-no-call-in-condition";
909
+ import { noGroupedConditionRule } from "@lint-suite/eslint-no-grouped-condition";
910
+ import { noInlineObjectTypesRule } from "@lint-suite/eslint-no-inline-object-types";
911
+ import { noInlineReturnObjectRule } from "@lint-suite/eslint-no-inline-return-object";
912
+ import { noNestedObjectValueRule } from "@lint-suite/eslint-no-nested-object-value";
913
+ import { noSpreadExpressionRule } from "@lint-suite/eslint-no-spread-expression";
914
+ import { noUnusedExportsRule } from "@lint-suite/eslint-no-unused-exports";
915
+ import { oneLineGuardRule } from "@lint-suite/eslint-one-line-guard";
916
+ import { readonlyTypePropertiesRule } from "@lint-suite/eslint-readonly-type-properties";
917
+ import { ternaryBranchShapeRule } from "@lint-suite/eslint-ternary-branch-shape";
918
+ import { testFileShapeRule } from "@lint-suite/eslint-test-file-shape";
919
+ import { typePlacementRule } from "@lint-suite/eslint-type-placement";
920
+ import { utilPurityRule } from "@lint-suite/eslint-util-purity";
921
921
  var meta = { name: "local" };
922
922
  var rules = {
923
- "arrow-body-fits-line": arrowBodyFitsLineRule,
923
+ "arrow-fits-line": arrowFitsLineRule,
924
924
  "chain-fits-line": chainFitsLineRule,
925
- "chain-receiver-is-name": chainReceiverIsNameRule,
925
+ "chain-receiver-name": chainReceiverNameRule,
926
926
  "explicit-accessibility": explicitAccessibilityRule,
927
927
  "max-condition-operands": maxConditionOperandsRule,
928
928
  "no-call-in-condition": noCallInConditionRule,
@@ -950,13 +950,13 @@ var typescriptSafety = defineConfig18([
950
950
  rules: {
951
951
  // Expression arrow whose body wraps gets a block body. Fixes.
952
952
  // Bad: (x) => a && b on two lines Good: (x) => { return a && b; }
953
- "local/arrow-body-fits-line": "error",
953
+ "local/arrow-fits-line": "error",
954
954
  // Two or more calls in one chain stay on one line.
955
955
  // Bad: a .b() .c() over three lines Good: const b = a.b(); b.c();
956
956
  "local/chain-fits-line": "error",
957
957
  // A member chain starts on a name, never on an inline expression.
958
958
  // Bad: (a ?? b).c Good: const ab = a ?? b; ab.c
959
- "local/chain-receiver-is-name": "error",
959
+ "local/chain-receiver-name": "error",
960
960
  // Every class member states public, private, or protected. Fixes.
961
961
  // Bad: field = 1; Good: private field = 1;
962
962
  "local/explicit-accessibility": "error",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lint-suite",
3
- "version": "2.3.0",
3
+ "version": "3.0.0",
4
4
  "description": "Reusable ESLint, Stylelint, and Prettier configurations",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,28 +25,28 @@
25
25
  "author": "Artiom Tofan artiomtofancv@gmail.com",
26
26
  "type": "module",
27
27
  "dependencies": {
28
- "@lint-suite/eslint-plugin-arrow-body-fits-line": "1.1.0",
29
- "@lint-suite/eslint-plugin-chain-fits-line": "1.1.0",
30
- "@lint-suite/eslint-plugin-chain-receiver-is-name": "1.1.0",
31
- "@lint-suite/eslint-plugin-explicit-accessibility": "1.1.0",
32
- "@lint-suite/eslint-plugin-max-condition-operands": "1.1.0",
33
- "@lint-suite/eslint-plugin-modular-boundaries": "1.0.0",
34
- "@lint-suite/eslint-plugin-no-call-in-condition": "1.1.0",
35
- "@lint-suite/eslint-plugin-no-grouped-condition": "1.1.0",
36
- "@lint-suite/eslint-plugin-no-inline-object-types": "1.1.0",
37
- "@lint-suite/eslint-plugin-no-inline-return-object": "1.1.0",
38
- "@lint-suite/eslint-plugin-no-nested-object-value": "1.1.0",
39
- "@lint-suite/eslint-plugin-no-spread-expression": "1.1.0",
40
- "@lint-suite/eslint-plugin-no-unused-exports": "1.1.0",
41
- "@lint-suite/eslint-plugin-one-line-guard": "1.1.0",
42
- "@lint-suite/eslint-plugin-readonly-type-properties": "1.1.0",
43
- "@lint-suite/eslint-plugin-ternary-branch-shape": "1.1.0",
44
- "@lint-suite/eslint-plugin-test-file-shape": "1.1.0",
45
- "@lint-suite/eslint-plugin-type-placement": "1.1.0",
46
- "@lint-suite/eslint-plugin-util-purity": "1.1.0",
47
- "@lint-suite/eslint-plugin-no-unused-angular-instance-fields": "1.2.0",
48
- "@lint-suite/eslint-plugin-no-unstyled-classes": "1.1.0",
49
- "@lint-suite/stylelint-no-unused-classes": "1.1.0",
28
+ "@lint-suite/eslint-arrow-fits-line": "1.0.0",
29
+ "@lint-suite/eslint-chain-fits-line": "1.0.0",
30
+ "@lint-suite/eslint-chain-receiver-name": "1.0.0",
31
+ "@lint-suite/eslint-explicit-accessibility": "1.0.0",
32
+ "@lint-suite/eslint-max-condition-operands": "1.0.0",
33
+ "@lint-suite/eslint-modular-boundaries": "1.0.0",
34
+ "@lint-suite/eslint-no-call-in-condition": "1.0.0",
35
+ "@lint-suite/eslint-no-grouped-condition": "1.0.0",
36
+ "@lint-suite/eslint-no-inline-object-types": "1.0.0",
37
+ "@lint-suite/eslint-no-inline-return-object": "1.0.0",
38
+ "@lint-suite/eslint-no-nested-object-value": "1.0.0",
39
+ "@lint-suite/eslint-no-spread-expression": "1.0.0",
40
+ "@lint-suite/eslint-no-unused-exports": "1.0.0",
41
+ "@lint-suite/eslint-one-line-guard": "1.0.0",
42
+ "@lint-suite/eslint-readonly-type-properties": "1.0.0",
43
+ "@lint-suite/eslint-ternary-branch-shape": "1.0.0",
44
+ "@lint-suite/eslint-test-file-shape": "1.0.0",
45
+ "@lint-suite/eslint-type-placement": "1.0.0",
46
+ "@lint-suite/eslint-util-purity": "1.0.0",
47
+ "@lint-suite/eslint-no-unused-angular-fields": "1.0.0",
48
+ "@lint-suite/eslint-no-unstyled-classes": "1.0.0",
49
+ "@lint-suite/stylelint-no-unused-classes": "2.0.0",
50
50
  "@eslint/js": "^10.0.1",
51
51
  "@eslint/json": "^2.1.1",
52
52
  "@smarttools/eslint-plugin-rxjs": "1.0.22",