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.
- package/CHANGELOG.md +27 -0
- package/README.md +12 -13
- package/eslint.js +26 -26
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
62
|
-
`@lint-suite/eslint
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 {
|
|
904
|
-
import { chainFitsLineRule } from "@lint-suite/eslint-
|
|
905
|
-
import {
|
|
906
|
-
import { explicitAccessibilityRule } from "@lint-suite/eslint-
|
|
907
|
-
import { maxConditionOperandsRule } from "@lint-suite/eslint-
|
|
908
|
-
import { noCallInConditionRule } from "@lint-suite/eslint-
|
|
909
|
-
import { noGroupedConditionRule } from "@lint-suite/eslint-
|
|
910
|
-
import { noInlineObjectTypesRule } from "@lint-suite/eslint-
|
|
911
|
-
import { noInlineReturnObjectRule } from "@lint-suite/eslint-
|
|
912
|
-
import { noNestedObjectValueRule } from "@lint-suite/eslint-
|
|
913
|
-
import { noSpreadExpressionRule } from "@lint-suite/eslint-
|
|
914
|
-
import { noUnusedExportsRule } from "@lint-suite/eslint-
|
|
915
|
-
import { oneLineGuardRule } from "@lint-suite/eslint-
|
|
916
|
-
import { readonlyTypePropertiesRule } from "@lint-suite/eslint-
|
|
917
|
-
import { ternaryBranchShapeRule } from "@lint-suite/eslint-
|
|
918
|
-
import { testFileShapeRule } from "@lint-suite/eslint-
|
|
919
|
-
import { typePlacementRule } from "@lint-suite/eslint-
|
|
920
|
-
import { utilPurityRule } from "@lint-suite/eslint-
|
|
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-
|
|
923
|
+
"arrow-fits-line": arrowFitsLineRule,
|
|
924
924
|
"chain-fits-line": chainFitsLineRule,
|
|
925
|
-
"chain-receiver-
|
|
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-
|
|
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-
|
|
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": "
|
|
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-
|
|
29
|
-
"@lint-suite/eslint-
|
|
30
|
-
"@lint-suite/eslint-
|
|
31
|
-
"@lint-suite/eslint-
|
|
32
|
-
"@lint-suite/eslint-
|
|
33
|
-
"@lint-suite/eslint-
|
|
34
|
-
"@lint-suite/eslint-
|
|
35
|
-
"@lint-suite/eslint-
|
|
36
|
-
"@lint-suite/eslint-
|
|
37
|
-
"@lint-suite/eslint-
|
|
38
|
-
"@lint-suite/eslint-
|
|
39
|
-
"@lint-suite/eslint-
|
|
40
|
-
"@lint-suite/eslint-
|
|
41
|
-
"@lint-suite/eslint-
|
|
42
|
-
"@lint-suite/eslint-
|
|
43
|
-
"@lint-suite/eslint-
|
|
44
|
-
"@lint-suite/eslint-
|
|
45
|
-
"@lint-suite/eslint-
|
|
46
|
-
"@lint-suite/eslint-
|
|
47
|
-
"@lint-suite/eslint-
|
|
48
|
-
"@lint-suite/eslint-
|
|
49
|
-
"@lint-suite/stylelint-no-unused-classes": "
|
|
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",
|