@moccu/eslint-config 0.6.0 → 0.8.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/.github/workflows/build.yml +6 -4
- package/.nvmrc +1 -1
- package/README.md +12 -40
- package/defaults/sort-class-members.js +2 -0
- package/helper/index.js +2 -0
- package/index.js +126 -128
- package/package.json +8 -6
- package/test/core.js +3 -2
- package/test/helper.js +2 -0
- package/test/index.js +2 -0
- package/react-proptypes.js +0 -19
- package/react.js +0 -79
|
@@ -4,14 +4,18 @@ on: push
|
|
|
4
4
|
jobs:
|
|
5
5
|
build:
|
|
6
6
|
runs-on: ubuntu-latest
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
id-token: write
|
|
10
|
+
packages: write
|
|
7
11
|
steps:
|
|
8
12
|
- name: Checkout 🛎️
|
|
9
|
-
uses: actions/checkout@
|
|
13
|
+
uses: actions/checkout@v7
|
|
10
14
|
with:
|
|
11
15
|
persist-credentials: false
|
|
12
16
|
|
|
13
17
|
- name: Setup 🔌
|
|
14
|
-
uses: actions/setup-node@
|
|
18
|
+
uses: actions/setup-node@v6
|
|
15
19
|
with:
|
|
16
20
|
node-version-file: '.nvmrc'
|
|
17
21
|
registry-url: https://registry.npmjs.org/
|
|
@@ -25,8 +29,6 @@ jobs:
|
|
|
25
29
|
- name: Publish 🚀
|
|
26
30
|
if: startsWith(github.ref, 'refs/tags/')
|
|
27
31
|
run: npm publish --access public
|
|
28
|
-
env:
|
|
29
|
-
NODE_AUTH_TOKEN: ${{secrets.NODE_AUTH_TOKEN}}
|
|
30
32
|
|
|
31
33
|
- name: Publish to GitHub 🚀
|
|
32
34
|
if: startsWith(github.ref, 'refs/tags/')
|
package/.nvmrc
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
lts/*
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://github.com/moccu/eslint-config-moccu/actions)
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
The eslint config we use at
|
|
6
|
+
The eslint config we use at Moccu
|
|
7
7
|
|
|
8
8
|
## Installation
|
|
9
9
|
|
|
@@ -13,49 +13,21 @@ $ npm install --save-dev @moccu/eslint-config
|
|
|
13
13
|
|
|
14
14
|
## Usage
|
|
15
15
|
|
|
16
|
-
### Base
|
|
17
|
-
|
|
18
|
-
This is a customized ruleset based on the [eslint recommended](https://eslint.org/docs/rules/)
|
|
19
|
-
rules.
|
|
20
|
-
|
|
21
|
-
```js
|
|
22
|
-
{
|
|
23
|
-
"extends": [
|
|
24
|
-
"@moccu/eslint-config"
|
|
25
|
-
],
|
|
26
|
-
"rules": {
|
|
27
|
-
// Additional rules...
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### React
|
|
33
|
-
|
|
34
|
-
This is a customized ruleset based on the [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react)
|
|
35
|
-
rules.
|
|
36
|
-
Separately there is a ruleset for proptypes-validation in `@moccu/eslint-config/react-proptypes`.
|
|
37
|
-
|
|
38
16
|
```js
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
],
|
|
45
|
-
|
|
46
|
-
|
|
17
|
+
// eslint.config.js
|
|
18
|
+
const {defineConfig} = require('eslint/config');
|
|
19
|
+
const moccu = require('@moccu/eslint-config');
|
|
20
|
+
|
|
21
|
+
module.exports = defineConfig([
|
|
22
|
+
moccu.configs['recommended'],
|
|
23
|
+
{
|
|
24
|
+
rules: {
|
|
25
|
+
semi: ['warn', 'always']
|
|
26
|
+
}
|
|
47
27
|
}
|
|
48
|
-
|
|
28
|
+
]);
|
|
49
29
|
```
|
|
50
30
|
|
|
51
|
-
## Contribute
|
|
52
|
-
|
|
53
|
-
* Add / Edit rules after agreements with developers at Moccu
|
|
54
|
-
* Run tests using `npm test`
|
|
55
|
-
* Set new version in [package.json](https://github.com/moccu/eslint-config-moccu/blob/master/package.json)
|
|
56
|
-
* Publish new version on npm using `npm publish --access=public`
|
|
57
|
-
* Add github release and tag including release notes
|
|
58
|
-
|
|
59
31
|
## License
|
|
60
32
|
|
|
61
33
|
[MIT](./LICENSE)
|
package/helper/index.js
CHANGED
package/index.js
CHANGED
|
@@ -1,139 +1,137 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
1
3
|
const
|
|
2
4
|
{CLASS_MEMBER_GROUPS, CLASS_MEMBER_ORDER} = require('./defaults/sort-class-members'),
|
|
3
|
-
_package = require('./package.json'),
|
|
4
5
|
js = require('@eslint/js'),
|
|
6
|
+
globals = require('globals'),
|
|
5
7
|
sortClassMembers = require('eslint-plugin-sort-class-members'),
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
'
|
|
23
|
-
'
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
'
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
'
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
'error', 'never'
|
|
115
|
-
],
|
|
116
|
-
'sort-class-members/sort-class-members': [2, {
|
|
117
|
-
order: CLASS_MEMBER_ORDER,
|
|
118
|
-
groups: CLASS_MEMBER_GROUPS
|
|
119
|
-
}]
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
;
|
|
123
|
-
|
|
124
|
-
plugin.configs = {
|
|
125
|
-
recommended: {
|
|
126
|
-
extends: ['eslint:recommended'],
|
|
127
|
-
plugins: ['sort-class-members'],
|
|
128
|
-
rules: plugin.rules
|
|
8
|
+
rules = {
|
|
9
|
+
'accessor-pairs': 'error',
|
|
10
|
+
'array-callback-return': 'error',
|
|
11
|
+
'block-scoped-var': 'error',
|
|
12
|
+
'complexity': 'error',
|
|
13
|
+
'consistent-this': [
|
|
14
|
+
2, 'self'
|
|
15
|
+
],
|
|
16
|
+
'curly': 'error',
|
|
17
|
+
'dot-notation': 'error',
|
|
18
|
+
'eqeqeq': 'error',
|
|
19
|
+
'func-name-matching': 'error',
|
|
20
|
+
'func-names': [
|
|
21
|
+
'error', 'never'
|
|
22
|
+
],
|
|
23
|
+
'func-style': [
|
|
24
|
+
'error',
|
|
25
|
+
'declaration', {
|
|
26
|
+
'allowArrowFunctions': true
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
'guard-for-in': 'error',
|
|
30
|
+
'id-match': 'error',
|
|
31
|
+
'max-depth': 'error',
|
|
32
|
+
'max-lines': [
|
|
33
|
+
'error', {
|
|
34
|
+
'max': 350,
|
|
35
|
+
'skipBlankLines': true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
'max-nested-callbacks': 'error',
|
|
39
|
+
'no-alert': 'error',
|
|
40
|
+
'no-array-constructor': 'error',
|
|
41
|
+
'no-await-in-loop': 'error',
|
|
42
|
+
'no-bitwise': 'error',
|
|
43
|
+
'no-caller': 'error',
|
|
44
|
+
'no-continue': 'error',
|
|
45
|
+
'no-div-regex': 'error',
|
|
46
|
+
'no-duplicate-imports': 'error',
|
|
47
|
+
'no-empty-function': 'error',
|
|
48
|
+
'no-eq-null': 'error',
|
|
49
|
+
'no-eval': 'error',
|
|
50
|
+
'no-extend-native': 'error',
|
|
51
|
+
'no-extra-bind': 'error',
|
|
52
|
+
'no-extra-label': 'error',
|
|
53
|
+
'no-implicit-coercion': [
|
|
54
|
+
'error', {
|
|
55
|
+
'boolean': false,
|
|
56
|
+
'number': false,
|
|
57
|
+
'string': false
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
'no-implicit-globals': 'error',
|
|
61
|
+
'no-implied-eval': 'error',
|
|
62
|
+
'no-inner-declarations': [
|
|
63
|
+
'error', 'functions'
|
|
64
|
+
],
|
|
65
|
+
'no-iterator': 'error',
|
|
66
|
+
'no-label-var': 'error',
|
|
67
|
+
'no-labels': 'error',
|
|
68
|
+
'no-lone-blocks': 'error',
|
|
69
|
+
'no-lonely-if': 'error',
|
|
70
|
+
'no-loop-func': 'error',
|
|
71
|
+
'no-multi-str': 'error',
|
|
72
|
+
'no-nested-ternary': 'error',
|
|
73
|
+
'no-new-func': 'error',
|
|
74
|
+
'no-new-wrappers': 'error',
|
|
75
|
+
'no-octal-escape': 'error',
|
|
76
|
+
'no-proto': 'error',
|
|
77
|
+
'no-prototype-builtins': 'error',
|
|
78
|
+
'no-restricted-globals': 'error',
|
|
79
|
+
'no-restricted-imports': 'error',
|
|
80
|
+
'no-restricted-properties': 'error',
|
|
81
|
+
'no-restricted-syntax': 'error',
|
|
82
|
+
'no-script-url': 'error',
|
|
83
|
+
'no-self-compare': 'error',
|
|
84
|
+
'no-shadow-restricted-names': 'error',
|
|
85
|
+
'no-template-curly-in-string': 'error',
|
|
86
|
+
'no-throw-literal': 'error',
|
|
87
|
+
'no-undef-init': 'error',
|
|
88
|
+
'no-unmodified-loop-condition': 'error',
|
|
89
|
+
'no-unneeded-ternary': 'error',
|
|
90
|
+
'no-useless-call': 'error',
|
|
91
|
+
'no-useless-computed-key': 'error',
|
|
92
|
+
'no-useless-concat': 'error',
|
|
93
|
+
'no-useless-constructor': 'error',
|
|
94
|
+
'no-useless-rename': 'error',
|
|
95
|
+
'no-useless-return': 'error',
|
|
96
|
+
'no-void': 'error',
|
|
97
|
+
'no-warning-comments': 'error',
|
|
98
|
+
'no-with': 'error',
|
|
99
|
+
'one-var': 'error',
|
|
100
|
+
'prefer-const': 'error',
|
|
101
|
+
'prefer-numeric-literals': 'error',
|
|
102
|
+
'prefer-promise-reject-errors': 'error',
|
|
103
|
+
'radix': [
|
|
104
|
+
'error', 'always'
|
|
105
|
+
],
|
|
106
|
+
'require-await': 'error',
|
|
107
|
+
'strict': 'error',
|
|
108
|
+
'symbol-description': 'error',
|
|
109
|
+
'unicode-bom': [
|
|
110
|
+
'error', 'never'
|
|
111
|
+
],
|
|
112
|
+
'sort-class-members/sort-class-members': [2, {
|
|
113
|
+
order: CLASS_MEMBER_ORDER,
|
|
114
|
+
groups: CLASS_MEMBER_GROUPS
|
|
115
|
+
}]
|
|
129
116
|
},
|
|
130
|
-
|
|
117
|
+
recommended = {
|
|
131
118
|
...js.configs.recommended,
|
|
119
|
+
languageOptions: {
|
|
120
|
+
...js.configs.recommended.languageOptions,
|
|
121
|
+
sourceType: 'commonjs',
|
|
122
|
+
globals: {
|
|
123
|
+
...globals.node
|
|
124
|
+
}
|
|
125
|
+
},
|
|
132
126
|
plugins: {
|
|
133
127
|
'sort-class-members': sortClassMembers
|
|
134
128
|
},
|
|
135
|
-
rules:
|
|
129
|
+
rules: {
|
|
130
|
+
...js.configs.recommended.rules,
|
|
131
|
+
...rules
|
|
132
|
+
}
|
|
136
133
|
}
|
|
137
|
-
|
|
134
|
+
;
|
|
138
135
|
|
|
139
|
-
module.exports =
|
|
136
|
+
module.exports.configs = { recommended };
|
|
137
|
+
module.exports.rules = rules;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moccu/eslint-config",
|
|
3
3
|
"description": "The eslint config we use at moccu",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.8.0",
|
|
5
5
|
"author": "Moccu GmbH & Co. KG",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": "moccu/eslint-config-moccu",
|
|
@@ -30,12 +30,14 @@
|
|
|
30
30
|
"hint"
|
|
31
31
|
],
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"eslint": "^
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
"eslint": "^10.6.0"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@eslint/js": "^10.0.1",
|
|
37
|
+
"eslint-plugin-sort-class-members": "^1.22.1",
|
|
38
|
+
"globals": "^17.7.0"
|
|
36
39
|
},
|
|
37
40
|
"peerDependencies": {
|
|
38
|
-
"eslint": ">=
|
|
39
|
-
"eslint-plugin-sort-class-members": "^1.20.0"
|
|
41
|
+
"eslint": ">=10.0.0"
|
|
40
42
|
}
|
|
41
43
|
}
|
package/test/core.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
1
3
|
(async function() {
|
|
2
4
|
const
|
|
3
5
|
assert = require('assert'),
|
|
4
6
|
{ESLint} = require('eslint'),
|
|
5
7
|
files = ['**/*.js'],
|
|
6
|
-
// configs = ['index', 'react', 'react-proptypes']
|
|
7
8
|
configs = ['index']
|
|
8
9
|
;
|
|
9
10
|
|
|
@@ -17,7 +18,7 @@
|
|
|
17
18
|
plugin = require(`../${name}.js`),
|
|
18
19
|
eslint = new ESLint({
|
|
19
20
|
overrideConfigFile: true,
|
|
20
|
-
overrideConfig: plugin.configs
|
|
21
|
+
overrideConfig: plugin.configs.recommended
|
|
21
22
|
}),
|
|
22
23
|
results = await eslint.lintFiles(files)
|
|
23
24
|
;
|
package/test/helper.js
CHANGED
package/test/index.js
CHANGED
package/react-proptypes.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
// @TODO: Add flat config
|
|
2
|
-
|
|
3
|
-
module.exports = {
|
|
4
|
-
plugins: [
|
|
5
|
-
'react'
|
|
6
|
-
],
|
|
7
|
-
rules: {
|
|
8
|
-
'react/boolean-prop-naming': [2, {'rule': '^(is|has|can)[A-Z]([A-Za-z0-9]?)+'}],
|
|
9
|
-
'react/no-unused-prop-types': [2],
|
|
10
|
-
'react/require-default-props': [2],
|
|
11
|
-
'react/sort-prop-types': [2, {
|
|
12
|
-
'callbacksLast': true,
|
|
13
|
-
'ignoreCase': true,
|
|
14
|
-
'requiredFirst': true,
|
|
15
|
-
'sortShapeProp': true,
|
|
16
|
-
'noSortAlphabetically': false
|
|
17
|
-
}]
|
|
18
|
-
}
|
|
19
|
-
};
|
package/react.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
// @TODO: Add flat config
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
{CLASS_MEMBER_GROUPS, CLASS_MEMBER_ORDER} = require('./defaults/sort-class-members')
|
|
5
|
-
;
|
|
6
|
-
|
|
7
|
-
module.exports = {
|
|
8
|
-
extends: [
|
|
9
|
-
'plugin:react/recommended'
|
|
10
|
-
],
|
|
11
|
-
plugins: [
|
|
12
|
-
'react',
|
|
13
|
-
'sort-class-members'
|
|
14
|
-
],
|
|
15
|
-
rules: {
|
|
16
|
-
'react/button-has-type': [2],
|
|
17
|
-
'react/display-name': 'off',
|
|
18
|
-
'react/no-access-state-in-setstate': [2],
|
|
19
|
-
'react/no-unused-state': [2],
|
|
20
|
-
'react/require-render-return': [2],
|
|
21
|
-
'react/jsx-curly-spacing': [2, {'when': 'never', 'allowMultiline': true}],
|
|
22
|
-
'react/jsx-equals-spacing': [2, 'never'],
|
|
23
|
-
'react/jsx-no-bind': [2],
|
|
24
|
-
'react/jsx-curly-brace-presence': [2],
|
|
25
|
-
'react/jsx-fragments': [2, 'element'],
|
|
26
|
-
'react/jsx-pascal-case': [2],
|
|
27
|
-
'react/jsx-props-no-multi-spaces': [2],
|
|
28
|
-
'react/jsx-sort-props': [2, {
|
|
29
|
-
'callbacksLast': true,
|
|
30
|
-
'ignoreCase': true,
|
|
31
|
-
'noSortAlphabetically': false,
|
|
32
|
-
'reservedFirst': true
|
|
33
|
-
}],
|
|
34
|
-
'react/jsx-tag-spacing': [2, {
|
|
35
|
-
'closingSlash': 'never',
|
|
36
|
-
'beforeSelfClosing': 'always',
|
|
37
|
-
'afterOpening': 'never',
|
|
38
|
-
'beforeClosing': 'never'
|
|
39
|
-
}],
|
|
40
|
-
'react/jsx-wrap-multilines': [2, {
|
|
41
|
-
'declaration': 'parens',
|
|
42
|
-
'assignment': 'parens',
|
|
43
|
-
'return': 'parens',
|
|
44
|
-
'arrow': 'parens',
|
|
45
|
-
'condition': 'parens',
|
|
46
|
-
'logical': 'parens',
|
|
47
|
-
'prop': 'parens'
|
|
48
|
-
}],
|
|
49
|
-
'sort-class-members/sort-class-members': [2, {
|
|
50
|
-
order: CLASS_MEMBER_ORDER
|
|
51
|
-
.insert('[framework-static-properties]').after('[static-properties]')
|
|
52
|
-
.insert('[framework-static-methods]').after('[static-methods]')
|
|
53
|
-
.insert('[framework-lifecycle-methods]').before('render'),
|
|
54
|
-
groups: Object.assign({}, CLASS_MEMBER_GROUPS, {
|
|
55
|
-
'framework-static-properties': [
|
|
56
|
-
{'name': 'propTypes', 'type': 'property', 'static': true},
|
|
57
|
-
{'name': 'defaultProps', 'type': 'property', 'static': true}
|
|
58
|
-
],
|
|
59
|
-
'framework-static-methods': [
|
|
60
|
-
{'name': 'getDerivedStateFromProps', 'type': 'method', 'static': true}
|
|
61
|
-
],
|
|
62
|
-
'framework-lifecycle-methods': [
|
|
63
|
-
{'name': 'componentWillMount', 'type': 'method'},
|
|
64
|
-
{'name': 'UNSAFE_componentWillMount', 'type': 'method'},
|
|
65
|
-
{'name': 'componentDidMount', 'type': 'method'},
|
|
66
|
-
{'name': 'componentWillReceiveProps', 'type': 'method'},
|
|
67
|
-
{'name': 'UNSAFE_componentWillReceiveProps', 'type': 'method'},
|
|
68
|
-
{'name': 'shouldComponentUpdate', 'type': 'method'},
|
|
69
|
-
{'name': 'componentWillUpdate', 'type': 'method'},
|
|
70
|
-
{'name': 'UNSAFE_componentWillUpdate', 'type': 'method'},
|
|
71
|
-
{'name': 'getSnapshotBeforeUpdate', 'type': 'method'},
|
|
72
|
-
{'name': 'componentDidUpdate', 'type': 'method'},
|
|
73
|
-
{'name': 'componentDidCatch', 'type': 'method'},
|
|
74
|
-
{'name': 'componentWillUnmount', 'type': 'method'}
|
|
75
|
-
]
|
|
76
|
-
})
|
|
77
|
-
}]
|
|
78
|
-
}
|
|
79
|
-
};
|