linter-bundle 7.10.0 → 7.12.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/.linter-bundle.js +1 -1
- package/CHANGELOG.md +54 -1
- package/README.md +6 -6
- package/eslint/index.mjs +6 -0
- package/eslint/javascript.mjs +2 -0
- package/eslint/jest.mjs +15 -2
- package/eslint/jsdoc.mjs +1 -0
- package/eslint/rules/enforce-logical-expression-parens.mjs +0 -1
- package/eslint/rules/enforce-ternary-parens.mjs +0 -1
- package/eslint/rules/no-ternary-return.mjs +0 -1
- package/helper/get-git-files.js +2 -2
- package/package.json +21 -21
- package/stylelint/index.mjs +15 -11
- package/stylelint/plugins/stylelint-15.11.0-stylistic/rules/media-feature-range-operator-space-before/index.mjs +1 -1
- package/stylelint/plugins/stylelint-selector-tag-no-without-class.js +4 -3
package/.linter-bundle.js
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -6,7 +6,60 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
-
[Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v7.
|
|
9
|
+
[Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v7.12.0...HEAD)
|
|
10
|
+
|
|
11
|
+
## [7.12.0] - 2026-02-20
|
|
12
|
+
|
|
13
|
+
### Breaking changes
|
|
14
|
+
|
|
15
|
+
- [general] Drop support for Node.js versions less than 20.19.0, 22.0.0-22.12.x as some of the dependencies are not supporting them anymore
|
|
16
|
+
- [stylelint] Replaced `stylelint-use-logical-spec` with [`stylelint-use-logical`](https://github.com/csstools/stylelint-use-logical). The rule name changed from `liberty/use-logical-spec` to `csstools/use-logical`.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- [eslint] Updated `@stylistic/eslint-plugin` from `5.6.1` to `5.9.0`
|
|
21
|
+
- [eslint] Updated `eslint` from `9.39.1` to `9.39.3`
|
|
22
|
+
- [eslint] Updated `eslint-plugin-jest` from `29.1.0` to `29.15.0`
|
|
23
|
+
- [eslint] Updated `eslint-plugin-jsdoc` from `61.3.0` to `62.7.0`
|
|
24
|
+
- [eslint] Updated `eslint-plugin-n` from `17.23.1` to `17.24.0`
|
|
25
|
+
- [eslint] Updated `eslint-plugin-unicorn` from `62.0.0` to `63.0.0`
|
|
26
|
+
- [eslint] Updated `globals` from `16.5.0` to `17.3.0`
|
|
27
|
+
- [eslint] Updated `typescript-eslint` from `8.47.0` to `8.56.0`
|
|
28
|
+
- [stylelint] Updated `stylelint` from `16.25.0` to `17.3.0`
|
|
29
|
+
- [stylelint] Updated `stylelint-declaration-block-no-ignored-properties` from `2.8.0` to `3.0.0`
|
|
30
|
+
- [stylelint] Updated `stylelint-high-performance-animation` from `1.11.0` to `2.0.0`
|
|
31
|
+
- [stylelint] Updated `stylelint-order` from `7.0.0` to `7.0.1`
|
|
32
|
+
- [stylelint] Updated `stylelint-scss` from `6.12.1` to `7.0.0`
|
|
33
|
+
- [markdown] Updated `markdownlint-cli` from `0.46.0` to `0.47.0`
|
|
34
|
+
- [eslint] Make use of new [`jsdoc/require-rejects`](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-rejects.md) rule
|
|
35
|
+
- [eslint] Make use of new [`unicorn/isolated-functions`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/isolated-functions.md) rule
|
|
36
|
+
- [eslint] Make use of new [`@typescript-eslint/no-unused-private-class-members`](https://typescript-eslint.io/rules/no-unused-private-class-members/) rule
|
|
37
|
+
- [eslint] Make use of new [`@typescript-eslint/no-useless-default-assignment`](https://typescript-eslint.io/rules/no-useless-default-assignment/) rule
|
|
38
|
+
- [eslint] Make use of new [`jest/no-error-equal`](https://github.com/jest-community/eslint-plugin-jest/blob/main/docs/rules/no-error-equal.md) rule
|
|
39
|
+
- [eslint] Make use of new [`jest/no-unneeded-async-expect-function`](https://github.com/jest-community/eslint-plugin-jest/blob/main/docs/rules/no-unneeded-async-expect-function.md) rule
|
|
40
|
+
- [eslint] Make use of new [`jest/no-unnecessary-assertion`](https://github.com/jest-community/eslint-plugin-jest/blob/main/docs/rules/no-unnecessary-assertion.md) rule
|
|
41
|
+
- [eslint] Make use of new [`jest/prefer-mock-return-shorthand`](https://github.com/jest-community/eslint-plugin-jest/blob/main/docs/rules/prefer-mock-return-shorthand.md) rule
|
|
42
|
+
- [eslint] Make use of new [`jest/prefer-to-have-been-called`](https://github.com/jest-community/eslint-plugin-jest/blob/main/docs/rules/prefer-to-have-been-called.md) rule
|
|
43
|
+
- [eslint] Make use of new [`jest/prefer-to-have-been-called-times`](https://github.com/jest-community/eslint-plugin-jest/blob/main/docs/rules/prefer-to-have-been-called-times.md) rule
|
|
44
|
+
- [eslint] Make use of new [`jest/valid-expect-with-promise`](https://github.com/jest-community/eslint-plugin-jest/blob/main/docs/rules/valid-expect-with-promise.md) rule
|
|
45
|
+
- [eslint] Make use of new [`jest/valid-mock-module-path`](https://github.com/jest-community/eslint-plugin-jest/blob/main/docs/rules/valid-mock-module-path.md) rule
|
|
46
|
+
- [eslint] Make use of new [`n/prefer-global/crypto`](https://github.com/eslint-community/eslint-plugin-n/blob/master/docs/rules/prefer-global/crypto.md) rule
|
|
47
|
+
- [eslint] Make use of new [`n/prefer-global/timers`](https://github.com/eslint-community/eslint-plugin-n/blob/master/docs/rules/prefer-global/timers.md) rule
|
|
48
|
+
- [eslint] Make use of new [`@typescript-eslint/strict-void-return`](https://typescript-eslint.io/rules/strict-void-return/) rule
|
|
49
|
+
- [eslint] Added but disabled [`@stylistic/jsx-props-style`](https://eslint.style/rules/jsx-props-style) rule, as it is an experimental feature
|
|
50
|
+
- [stylelint] Added but disabled [`display-notation`](https://stylelint.io/user-guide/rules/display-notation/) rule
|
|
51
|
+
- [stylelint] Added but disabled [`scss/selector-class-pattern`](https://github.com/stylelint-scss/stylelint-scss/tree/master/src/rules/selector-class-pattern) rule
|
|
52
|
+
- [stylelint] Updated forked `plugin/selector-tag-no-without-class` for stylelint 17 compatibility (adapted `parseSelector` API change)
|
|
53
|
+
|
|
54
|
+
[Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v7.11.0...v7.12.0)
|
|
55
|
+
|
|
56
|
+
## [7.11.0] - 2025-11-19
|
|
57
|
+
|
|
58
|
+
- [eslint] Update `eslint-plugin-jsdoc`from `61.2.1` to `61.3.0`
|
|
59
|
+
- [eslint/jest] Report Jest version detection output only once (instead of once per thread)
|
|
60
|
+
- [stylelint] Added "transform-box", "transition-behavior" and "interpolate-size" to `order/properties-order` rule, and moved "content-visibility" behind "display", and "box-sizing" behind "all"
|
|
61
|
+
|
|
62
|
+
[Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v7.10.0...v7.11.0)
|
|
10
63
|
|
|
11
64
|
## [7.10.0] - 2025-11-19
|
|
12
65
|
|
package/README.md
CHANGED
|
@@ -56,7 +56,7 @@ Beside that, the following additional rules are part of this bundle:
|
|
|
56
56
|
- [stylelint-scss](https://www.npmjs.com/package/stylelint-scss)
|
|
57
57
|
- [stylelint-selector-no-empty](https://www.npmjs.com/package/stylelint-selector-no-empty) (Forked version)
|
|
58
58
|
- [stylelint-selector-tag-no-without-class](https://www.npmjs.com/package/stylelint-selector-tag-no-without-class) (Forked version)
|
|
59
|
-
- [stylelint-use-logical
|
|
59
|
+
- [stylelint-use-logical](https://www.npmjs.com/package/stylelint-use-logical)
|
|
60
60
|
|
|
61
61
|
Beside that [72 stylistic rules](https://github.com/jens-duttke/linter-bundle/tree/main/stylelint/plugins/stylelint-15.11.0-stylistic/rules) has been forked from `stylelint@15.11.0`, which have been removed in `stylelint@16.0.0`, are part of this bundle.
|
|
62
62
|
|
|
@@ -113,8 +113,8 @@ export default [
|
|
|
113
113
|
...reactConfig,
|
|
114
114
|
...storybookConfig,
|
|
115
115
|
...typeDeclarationsConfig,
|
|
116
|
-
...workerConfig
|
|
117
|
-
...jestConfig
|
|
116
|
+
...workerConfig,
|
|
117
|
+
...jestConfig
|
|
118
118
|
]
|
|
119
119
|
```
|
|
120
120
|
|
|
@@ -668,7 +668,7 @@ To ensure the stylelint plugins are correctly loaded, you need to adjust the set
|
|
|
668
668
|
```json
|
|
669
669
|
{
|
|
670
670
|
"stylelint.enable": true,
|
|
671
|
-
"stylelint.validate": [
|
|
671
|
+
"stylelint.validate": [
|
|
672
672
|
"css",
|
|
673
673
|
"scss"
|
|
674
674
|
],
|
|
@@ -685,8 +685,8 @@ In order to fix the code according to the ESLint/stylelint rules when saving, th
|
|
|
685
685
|
```json
|
|
686
686
|
{
|
|
687
687
|
"editor.codeActionsOnSave": {
|
|
688
|
-
"source.fixAll.eslint":
|
|
689
|
-
"source.fixAll.stylelint":
|
|
688
|
+
"source.fixAll.eslint": "explicit",
|
|
689
|
+
"source.fixAll.stylelint": "explicit"
|
|
690
690
|
}
|
|
691
691
|
}
|
|
692
692
|
```
|
package/eslint/index.mjs
CHANGED
|
@@ -465,6 +465,7 @@ export default [
|
|
|
465
465
|
ignoredNodes: ['ConditionalExpression']
|
|
466
466
|
}
|
|
467
467
|
],
|
|
468
|
+
'@stylistic/jsx-props-style': 'off', // Experimental feature
|
|
468
469
|
'@stylistic/key-spacing': 'error',
|
|
469
470
|
'@stylistic/member-delimiter-style': ['error', { multiline: { delimiter: 'semi', requireLast: true }, singleline: { delimiter: 'semi', requireLast: true } }],
|
|
470
471
|
'@stylistic/no-extra-semi': 'error',
|
|
@@ -795,6 +796,7 @@ export default [
|
|
|
795
796
|
'@typescript-eslint/no-unsafe-unary-minus': 'error',
|
|
796
797
|
'@typescript-eslint/no-unused-expressions': 'error',
|
|
797
798
|
'@typescript-eslint/no-unsafe-type-assertion': 'error',
|
|
799
|
+
'@typescript-eslint/no-unused-private-class-members': 'error',
|
|
798
800
|
'@typescript-eslint/no-unused-vars': ['error', {
|
|
799
801
|
args: 'all',
|
|
800
802
|
argsIgnorePattern: '^_',
|
|
@@ -806,6 +808,7 @@ export default [
|
|
|
806
808
|
}],
|
|
807
809
|
'@typescript-eslint/no-use-before-define': ['error', { functions: false }],
|
|
808
810
|
'@typescript-eslint/no-useless-constructor': 'error',
|
|
811
|
+
'@typescript-eslint/no-useless-default-assignment': 'error',
|
|
809
812
|
'@typescript-eslint/no-useless-empty-export': 'error',
|
|
810
813
|
'@typescript-eslint/no-var-requires': 'error',
|
|
811
814
|
'@typescript-eslint/non-nullable-type-assertion-style': 'off', // Conflicts with `no-non-null-assertion`, which we prefer
|
|
@@ -841,6 +844,7 @@ export default [
|
|
|
841
844
|
'@typescript-eslint/sort-type-constituents': 'off', // Types should be sorted and grouped by priority and their meaning, not alphabetically
|
|
842
845
|
'@typescript-eslint/sort-type-union-intersection-members': 'off', // Types should be sorted and grouped by priority and their meaning, not alphabetically
|
|
843
846
|
'@typescript-eslint/strict-boolean-expressions': ['off', { allowNullable: true, allowSafe: true, ignoreRhs: true }], // @todo Doesn't work for specific code, check later after all linter warnings are fixed, maybe at some positions we can use '??'
|
|
847
|
+
'@typescript-eslint/strict-void-return': 'error',
|
|
844
848
|
'@typescript-eslint/switch-exhaustiveness-check': ['error', { considerDefaultExhaustiveForUnions: true }],
|
|
845
849
|
'@typescript-eslint/triple-slash-reference': 'error',
|
|
846
850
|
'@typescript-eslint/typedef': 'off', // We are using "noImplicitAny" in tsconfig.json instead
|
|
@@ -958,6 +962,7 @@ export default [
|
|
|
958
962
|
|
|
959
963
|
/**
|
|
960
964
|
* eslint-plugin-eslint-comments
|
|
965
|
+
*
|
|
961
966
|
* @see https://mysticatea.github.io/eslint-plugin-eslint-comments/
|
|
962
967
|
*/
|
|
963
968
|
'eslint-comments/disable-enable-pair': ['error', { allowWholeFile: true }],
|
|
@@ -1047,6 +1052,7 @@ export default [
|
|
|
1047
1052
|
}
|
|
1048
1053
|
}
|
|
1049
1054
|
}],
|
|
1055
|
+
'unicorn/isolated-functions': 'error',
|
|
1050
1056
|
'unicorn/new-for-builtins': 'error',
|
|
1051
1057
|
'unicorn/no-abusive-eslint-disable': 'error',
|
|
1052
1058
|
'unicorn/no-accessor-recursion': 'error',
|
package/eslint/javascript.mjs
CHANGED
|
@@ -86,9 +86,11 @@ export default [
|
|
|
86
86
|
'n/no-top-level-await': 'off', // Conflicts with unicorn/prefer-await
|
|
87
87
|
'n/prefer-global/buffer': 'error',
|
|
88
88
|
'n/prefer-global/console': 'error',
|
|
89
|
+
'n/prefer-global/crypto': 'error',
|
|
89
90
|
'n/prefer-global/process': 'error',
|
|
90
91
|
'n/prefer-global/text-decoder': 'error',
|
|
91
92
|
'n/prefer-global/text-encoder': 'error',
|
|
93
|
+
'n/prefer-global/timers': 'error',
|
|
92
94
|
'n/prefer-global/url-search-params': 'error',
|
|
93
95
|
'n/prefer-global/url': 'error',
|
|
94
96
|
'n/prefer-promises/dns': 'error',
|
package/eslint/jest.mjs
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { createRequire } from 'node:module';
|
|
6
|
+
import { isMainThread } from 'node:worker_threads';
|
|
6
7
|
|
|
7
8
|
import jestPlugin from 'eslint-plugin-jest';
|
|
8
9
|
import globals from 'globals';
|
|
@@ -70,6 +71,7 @@ export default [
|
|
|
70
71
|
'jest/no-disabled-tests': 'error',
|
|
71
72
|
'jest/no-done-callback': 'error',
|
|
72
73
|
'jest/no-duplicate-hooks': 'error',
|
|
74
|
+
'jest/no-error-equal': 'error',
|
|
73
75
|
'jest/no-export': 'error',
|
|
74
76
|
'jest/no-focused-tests': 'error',
|
|
75
77
|
'jest/no-hooks': ['error', { allow: ['beforeEach', 'afterEach', 'afterAll'] }],
|
|
@@ -89,6 +91,8 @@ export default [
|
|
|
89
91
|
'jest/no-standalone-expect': 'error',
|
|
90
92
|
'jest/no-test-prefixes': 'error',
|
|
91
93
|
'jest/no-test-return-statement': 'error',
|
|
94
|
+
'jest/no-unneeded-async-expect-function': 'error',
|
|
95
|
+
'jest/no-unnecessary-assertion': 'error',
|
|
92
96
|
'jest/prefer-called-with': 'error',
|
|
93
97
|
'jest/prefer-expect-assertions': ['error', { onlyFunctionsWithAsyncKeyword: true }],
|
|
94
98
|
'jest/prefer-expect-resolves': 'off', // We prefer `expect(await promise)` enforced by 'jest/no-restricted-matchers'
|
|
@@ -101,11 +105,14 @@ export default [
|
|
|
101
105
|
'jest/prefer-importing-jest-globals': 'error',
|
|
102
106
|
'jest/prefer-jest-mocked': 'error',
|
|
103
107
|
'jest/prefer-mock-promise-shorthand': 'error',
|
|
108
|
+
'jest/prefer-mock-return-shorthand': 'error',
|
|
104
109
|
'jest/prefer-snapshot-hint': 'error',
|
|
105
110
|
'jest/prefer-spy-on': 'error',
|
|
106
111
|
'jest/prefer-strict-equal': 'error',
|
|
107
112
|
'jest/prefer-to-be': 'error',
|
|
108
113
|
'jest/prefer-to-contain': 'error',
|
|
114
|
+
'jest/prefer-to-have-been-called': 'error',
|
|
115
|
+
'jest/prefer-to-have-been-called-times': 'error',
|
|
109
116
|
'jest/prefer-to-have-length': 'error',
|
|
110
117
|
'jest/prefer-todo': 'error',
|
|
111
118
|
'jest/require-hook': 'error',
|
|
@@ -115,6 +122,8 @@ export default [
|
|
|
115
122
|
'jest/valid-describe-callback': 'error',
|
|
116
123
|
'jest/valid-expect-in-promise': 'error',
|
|
117
124
|
'jest/valid-expect': 'error',
|
|
125
|
+
'jest/valid-expect-with-promise': 'error',
|
|
126
|
+
'jest/valid-mock-module-path': 'error',
|
|
118
127
|
'jest/valid-title': 'error'
|
|
119
128
|
}
|
|
120
129
|
},
|
|
@@ -165,12 +174,16 @@ async function getJestVersion () {
|
|
|
165
174
|
const jest = ('default' in jestModule ? jestModule.default : jestModule);
|
|
166
175
|
const version = jest.getVersion().split('.')[0];
|
|
167
176
|
|
|
168
|
-
|
|
177
|
+
if (isMainThread) {
|
|
178
|
+
process.stdout.write(`Detected Jest version: ${version}\n\n`);
|
|
179
|
+
}
|
|
169
180
|
|
|
170
181
|
return version;
|
|
171
182
|
}
|
|
172
183
|
catch {
|
|
173
|
-
|
|
184
|
+
if (isMainThread) {
|
|
185
|
+
process.stderr.write('No Jest version detected\n\n');
|
|
186
|
+
}
|
|
174
187
|
|
|
175
188
|
return 'detect';
|
|
176
189
|
}
|
package/eslint/jsdoc.mjs
CHANGED
|
@@ -77,6 +77,7 @@ export default [
|
|
|
77
77
|
'jsdoc/require-returns-description': 'error',
|
|
78
78
|
'jsdoc/require-returns-type': 'error',
|
|
79
79
|
'jsdoc/require-returns': ['error', { forceReturnsWithAsync: true }],
|
|
80
|
+
'jsdoc/require-rejects': 'error',
|
|
80
81
|
'jsdoc/require-template-description': 'off',
|
|
81
82
|
'jsdoc/require-template': 'error',
|
|
82
83
|
'jsdoc/require-throws-description': 'error',
|
package/helper/get-git-files.js
CHANGED
|
@@ -34,12 +34,12 @@ export async function getGitFiles () {
|
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
if (!gitFiles) {
|
|
37
|
-
const deletedFiles = gitProcessResult.deleted.stdout.trim().split('\0');
|
|
37
|
+
const deletedFiles = new Set(gitProcessResult.deleted.stdout.trim().split('\0'));
|
|
38
38
|
|
|
39
39
|
gitFiles = [
|
|
40
40
|
...gitProcessResult.diff.stdout.trim().split('\0'),
|
|
41
41
|
...gitProcessResult.modified.stdout.trim().split('\0')
|
|
42
|
-
].filter((file, index, self) => (!deletedFiles.
|
|
42
|
+
].filter((file, index, self) => (!deletedFiles.has(file) && self.indexOf(file) === index));
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
return gitFiles;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "linter-bundle",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.12.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Ready-to use bundle of linting tools, containing configurations for ESLint, stylelint and markdownlint.",
|
|
6
6
|
"keywords": [
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"lint": "lint.js"
|
|
25
25
|
},
|
|
26
26
|
"engines": {
|
|
27
|
-
"node": "^20.
|
|
27
|
+
"node": "^20.19.0 || ^22.13.0 || >=24.0.0"
|
|
28
28
|
},
|
|
29
29
|
"repository": {
|
|
30
30
|
"type": "git",
|
|
@@ -35,40 +35,40 @@
|
|
|
35
35
|
"publish:minor": "npm version minor",
|
|
36
36
|
"publish:patch": "npm version patch",
|
|
37
37
|
"lint": "npm run _test-stylelint && npm run _stylelint-find-rules && node ./lint files tsc ts md audit --min-severity=critical",
|
|
38
|
-
"preversion": "npm run check-outdated && npm run lint",
|
|
38
|
+
"preversion": "npm whoami && npm run check-outdated && npm run lint",
|
|
39
39
|
"postversion": "git push && git push --tags && npm publish",
|
|
40
|
-
"check-outdated": "npx --yes -- check-outdated --ignore-pre-releases",
|
|
40
|
+
"check-outdated": "npx --yes -- check-outdated --ignore-pre-releases --min-age 30 --min-age-patch 1",
|
|
41
41
|
"_stylelint-find-rules": "stylelint-find-new-rules ./stylelint/index.mjs",
|
|
42
42
|
"_test-stylelint": "node ./test-stylelint.js"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@stylistic/eslint-plugin": "5.
|
|
46
|
-
"eslint": "9.39.
|
|
45
|
+
"@stylistic/eslint-plugin": "5.9.0",
|
|
46
|
+
"eslint": "9.39.3",
|
|
47
47
|
"eslint-formatter-unix": "9.0.1",
|
|
48
48
|
"eslint-import-resolver-typescript": "4.4.4",
|
|
49
49
|
"eslint-import-resolver-webpack": "0.13.10",
|
|
50
50
|
"eslint-plugin-eslint-comments": "3.2.0",
|
|
51
51
|
"eslint-plugin-functional": "9.0.2",
|
|
52
52
|
"eslint-plugin-import": "2.32.0",
|
|
53
|
-
"eslint-plugin-jest": "29.
|
|
54
|
-
"eslint-plugin-jsdoc": "
|
|
53
|
+
"eslint-plugin-jest": "29.15.0",
|
|
54
|
+
"eslint-plugin-jsdoc": "62.7.0",
|
|
55
55
|
"eslint-plugin-jsx-a11y": "6.10.2",
|
|
56
|
-
"eslint-plugin-n": "17.
|
|
56
|
+
"eslint-plugin-n": "17.24.0",
|
|
57
57
|
"eslint-plugin-promise": "7.2.1",
|
|
58
58
|
"eslint-plugin-react": "7.37.5",
|
|
59
59
|
"eslint-plugin-react-hooks": "7.0.1",
|
|
60
|
-
"eslint-plugin-unicorn": "
|
|
61
|
-
"globals": "
|
|
62
|
-
"markdownlint-cli": "0.
|
|
60
|
+
"eslint-plugin-unicorn": "63.0.0",
|
|
61
|
+
"globals": "17.3.0",
|
|
62
|
+
"markdownlint-cli": "0.47.0",
|
|
63
63
|
"micromatch": "4.0.8",
|
|
64
64
|
"postcss-scss": "4.0.9",
|
|
65
|
-
"stylelint": "
|
|
66
|
-
"stylelint-declaration-block-no-ignored-properties": "
|
|
67
|
-
"stylelint-high-performance-animation": "
|
|
68
|
-
"stylelint-order": "7.0.
|
|
69
|
-
"stylelint-scss": "
|
|
70
|
-
"stylelint-use-logical
|
|
71
|
-
"typescript-eslint": "8.
|
|
65
|
+
"stylelint": "17.3.0",
|
|
66
|
+
"stylelint-declaration-block-no-ignored-properties": "3.0.0",
|
|
67
|
+
"stylelint-high-performance-animation": "2.0.0",
|
|
68
|
+
"stylelint-order": "7.0.1",
|
|
69
|
+
"stylelint-scss": "7.0.0",
|
|
70
|
+
"stylelint-use-logical": "2.1.3",
|
|
71
|
+
"typescript-eslint": "8.56.0"
|
|
72
72
|
},
|
|
73
73
|
"peerDependencies": {
|
|
74
74
|
"@typescript-eslint/utils": "*",
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
"devDependencies": {
|
|
79
79
|
"@types/eslint": "9.6.1",
|
|
80
80
|
"@types/micromatch": "4.0.10",
|
|
81
|
-
"@types/node": "
|
|
82
|
-
"stylelint-find-new-rules": "
|
|
81
|
+
"@types/node": "25.3.0",
|
|
82
|
+
"stylelint-find-new-rules": "6.0.0",
|
|
83
83
|
"typescript": "5.9.3"
|
|
84
84
|
}
|
|
85
85
|
}
|
package/stylelint/index.mjs
CHANGED
|
@@ -16,7 +16,7 @@ export default {
|
|
|
16
16
|
'stylelint-declaration-block-no-ignored-properties',
|
|
17
17
|
'stylelint-order',
|
|
18
18
|
'stylelint-scss',
|
|
19
|
-
'stylelint-use-logical
|
|
19
|
+
'stylelint-use-logical',
|
|
20
20
|
'stylelint-high-performance-animation',
|
|
21
21
|
await import('./plugins/stylelint-selector-no-empty.js'),
|
|
22
22
|
await import('./plugins/stylelint-selector-tag-no-without-class.js'),
|
|
@@ -329,6 +329,7 @@ export default {
|
|
|
329
329
|
'declaration-property-value-disallowed-list': null,
|
|
330
330
|
'declaration-property-value-keyword-no-deprecated': true,
|
|
331
331
|
'declaration-property-value-no-unknown': true,
|
|
332
|
+
'display-notation': null, // Not yet enforcing short vs. long display notation (e.g. "block flow" vs. "block")
|
|
332
333
|
'font-family-name-quotes': 'always-where-recommended',
|
|
333
334
|
'font-family-no-duplicate-names': true,
|
|
334
335
|
'font-family-no-missing-generic-family-keyword': true,
|
|
@@ -577,14 +578,15 @@ export default {
|
|
|
577
578
|
'order/properties-order': [
|
|
578
579
|
[
|
|
579
580
|
{
|
|
580
|
-
groupName: 'Reset',
|
|
581
|
+
groupName: 'Reset & Defaults',
|
|
581
582
|
emptyLineBefore: 'always',
|
|
582
583
|
noEmptyLineBetween: true,
|
|
583
584
|
properties: [
|
|
584
|
-
'all'
|
|
585
|
+
'all',
|
|
586
|
+
'box-sizing',
|
|
587
|
+
'interpolate-size'
|
|
585
588
|
]
|
|
586
589
|
},
|
|
587
|
-
|
|
588
590
|
{
|
|
589
591
|
groupName: 'Performance Optimizations',
|
|
590
592
|
emptyLineBefore: 'always',
|
|
@@ -611,6 +613,7 @@ export default {
|
|
|
611
613
|
noEmptyLineBetween: true,
|
|
612
614
|
properties: [
|
|
613
615
|
'display',
|
|
616
|
+
'content-visibility',
|
|
614
617
|
'visibility',
|
|
615
618
|
|
|
616
619
|
'appearance',
|
|
@@ -635,9 +638,7 @@ export default {
|
|
|
635
638
|
'inset-block-end',
|
|
636
639
|
'inset-inline',
|
|
637
640
|
'inset-inline-start',
|
|
638
|
-
'inset-inline-end'
|
|
639
|
-
|
|
640
|
-
'box-sizing'
|
|
641
|
+
'inset-inline-end'
|
|
641
642
|
]
|
|
642
643
|
},
|
|
643
644
|
{
|
|
@@ -829,6 +830,7 @@ export default {
|
|
|
829
830
|
properties: [
|
|
830
831
|
'transform',
|
|
831
832
|
'transform-origin',
|
|
833
|
+
'transform-box',
|
|
832
834
|
'transform-style',
|
|
833
835
|
'backface-visibility',
|
|
834
836
|
'perspective',
|
|
@@ -844,7 +846,8 @@ export default {
|
|
|
844
846
|
'transition-property',
|
|
845
847
|
'transition-duration',
|
|
846
848
|
'transition-timing-function',
|
|
847
|
-
'transition-delay'
|
|
849
|
+
'transition-delay',
|
|
850
|
+
'transition-behavior'
|
|
848
851
|
]
|
|
849
852
|
},
|
|
850
853
|
{
|
|
@@ -1137,6 +1140,7 @@ export default {
|
|
|
1137
1140
|
'scss/partial-no-import': null,
|
|
1138
1141
|
'scss/percent-placeholder-pattern': null,
|
|
1139
1142
|
'scss/property-no-unknown': [true, { ignoreProperties: ['composes'] }],
|
|
1143
|
+
'scss/selector-class-pattern': null, // Already handled by core selector-class-pattern rule
|
|
1140
1144
|
'scss/selector-nest-combinators': null, // Sometimes nesting does not make sense
|
|
1141
1145
|
'scss/selector-no-redundant-nesting-selector': true,
|
|
1142
1146
|
'scss/selector-no-union-class-name': null,
|
|
@@ -1156,11 +1160,11 @@ export default {
|
|
|
1156
1160
|
'plugin/selector-tag-no-without-class': null,
|
|
1157
1161
|
|
|
1158
1162
|
/**
|
|
1159
|
-
* stylelint-use-logical
|
|
1163
|
+
* stylelint-use-logical
|
|
1160
1164
|
*
|
|
1161
|
-
* @see https://github.com/
|
|
1165
|
+
* @see https://github.com/csstools/stylelint-use-logical
|
|
1162
1166
|
*/
|
|
1163
|
-
'
|
|
1167
|
+
'csstools/use-logical': ['always', { except: [
|
|
1164
1168
|
'float',
|
|
1165
1169
|
|
|
1166
1170
|
'inset',
|
|
@@ -39,7 +39,7 @@ const rule = (primary, _secondaryOptions) => {
|
|
|
39
39
|
/** @type {number[]} */
|
|
40
40
|
const fixOperatorIndices = [];
|
|
41
41
|
findMediaOperator(atRule, (match, parameters, node) => {
|
|
42
|
-
checkBeforeOperator(match, parameters, node, (index) => fixOperatorIndices.push(index));
|
|
42
|
+
checkBeforeOperator(match, parameters, node, (index) => { fixOperatorIndices.push(index); });
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
if (fixOperatorIndices.length > 0) {
|
|
@@ -188,10 +188,11 @@ function rule (primaryOption, secondaryOptions = {}) {
|
|
|
188
188
|
}
|
|
189
189
|
|
|
190
190
|
for (const selector of ruleNode.selectors) {
|
|
191
|
-
|
|
192
|
-
|
|
191
|
+
const container = parseSelector(selector, result, ruleNode);
|
|
192
|
+
|
|
193
|
+
if (container) {
|
|
193
194
|
checkSelectorRoot(container, ruleNode);
|
|
194
|
-
}
|
|
195
|
+
}
|
|
195
196
|
}
|
|
196
197
|
});
|
|
197
198
|
};
|