@egy186/eslint-config 0.65.0 → 0.69.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/base.js +130 -139
  2. package/jest.js +4 -1
  3. package/jsdoc.js +1 -0
  4. package/package.json +13 -13
package/base.js CHANGED
@@ -3,39 +3,35 @@
3
3
  /* eslint max-lines: "off" */
4
4
 
5
5
  module.exports = {
6
- env: { es2017: true },
7
- parserOptions: { ecmaVersion: 2018 },
6
+ env: { es2019: true },
8
7
  reportUnusedDisableDirectives: true,
9
8
  rules: {
10
9
  ...{
11
- // Possible Errors
10
+ // Possible Problems
11
+ 'array-callback-return': ['error', { checkForEach: true }],
12
+ 'constructor-super': 'error',
12
13
  'for-direction': 'error',
13
14
  'getter-return': 'error',
14
15
  'no-async-promise-executor': 'error',
15
16
  'no-await-in-loop': 'error',
17
+ 'no-class-assign': 'error',
16
18
  'no-compare-neg-zero': 'error',
17
19
  'no-cond-assign': ['error', 'always'],
18
- 'no-console': 'warn',
20
+ 'no-const-assign': 'error',
19
21
  'no-constant-condition': 'error',
22
+ 'no-constructor-return': 'error',
20
23
  'no-control-regex': 'error',
21
24
  'no-debugger': 'error',
22
25
  'no-dupe-args': 'error',
26
+ 'no-dupe-class-members': 'error',
23
27
  'no-dupe-else-if': 'error',
24
28
  'no-dupe-keys': 'error',
25
29
  'no-duplicate-case': 'error',
26
- 'no-empty': 'error',
30
+ 'no-duplicate-imports': 'error',
27
31
  'no-empty-character-class': 'error',
32
+ 'no-empty-pattern': 'error',
28
33
  'no-ex-assign': 'error',
29
- 'no-extra-boolean-cast': 'error',
30
- 'no-extra-parens': [
31
- 'error',
32
- 'all',
33
- {
34
- ignoreJSX: 'multi-line',
35
- nestedBinaryExpressions: false
36
- }
37
- ],
38
- 'no-extra-semi': 'error',
34
+ 'no-fallthrough': 'error',
39
35
  'no-func-assign': 'error',
40
36
  'no-import-assign': 'error',
41
37
  'no-inner-declarations': 'error',
@@ -43,135 +39,193 @@ module.exports = {
43
39
  'no-irregular-whitespace': 'error',
44
40
  'no-loss-of-precision': 'error',
45
41
  'no-misleading-character-class': 'error',
42
+ 'no-new-symbol': 'error',
46
43
  'no-obj-calls': 'error',
47
44
  'no-promise-executor-return': 'error',
48
45
  'no-prototype-builtins': 'error',
49
- 'no-regex-spaces': 'error',
46
+ 'no-self-assign': 'error',
47
+ 'no-self-compare': 'error',
50
48
  'no-setter-return': 'error',
51
49
  'no-sparse-arrays': 'error',
52
50
  'no-template-curly-in-string': 'error',
51
+ 'no-this-before-super': 'error',
52
+ 'no-undef': 'error',
53
53
  'no-unexpected-multiline': 'error',
54
+ 'no-unmodified-loop-condition': 'error',
54
55
  'no-unreachable': 'error',
55
56
  'no-unreachable-loop': 'error',
56
57
  'no-unsafe-finally': 'error',
57
58
  'no-unsafe-negation': 'error',
58
59
  'no-unsafe-optional-chaining': ['error', { disallowArithmeticOperators: true }],
59
60
  'no-unused-private-class-members': 'error',
61
+ 'no-unused-vars': [
62
+ 'error',
63
+ {
64
+ args: 'after-used',
65
+ caughtErrors: 'all',
66
+ vars: 'all'
67
+ }
68
+ ],
69
+ 'no-use-before-define': 'error',
60
70
  'no-useless-backreference': 'error',
61
71
  'require-atomic-updates': 'error',
62
72
  'use-isnan': 'error',
63
73
  'valid-typeof': 'error'
64
74
  },
65
75
  ...{
66
- // Best Practices
76
+ // Suggestions
67
77
  'accessor-pairs': 'error',
68
- 'array-callback-return': ['error', { checkForEach: true }],
78
+ 'arrow-body-style': ['error', 'as-needed'],
69
79
  'block-scoped-var': 'error',
80
+ camelcase: ['error', { properties: 'never' }],
81
+ 'capitalized-comments': 'error',
70
82
  'class-methods-use-this': 'error',
71
83
  complexity: ['warn', 12],
72
84
  'consistent-return': 'error',
85
+ 'consistent-this': 'error',
73
86
  curly: ['error', 'all'],
74
87
  'default-case': 'error',
75
88
  'default-case-last': 'error',
76
89
  'default-param-last': 'error',
77
- 'dot-location': ['error', 'property'],
78
90
  'dot-notation': 'error',
79
91
  eqeqeq: 'error',
92
+ 'func-name-matching': 'error',
93
+ 'func-names': ['error', 'as-needed'],
94
+ 'func-style': ['error', 'expression'],
80
95
  'grouped-accessor-pairs': ['error', 'getBeforeSet'],
81
96
  'guard-for-in': 'error',
97
+ 'id-denylist': 'off',
98
+ 'id-length': 'off',
99
+ 'id-match': 'off',
100
+ 'init-declarations': 'error',
82
101
  'max-classes-per-file': 'error',
102
+ 'max-depth': 'error',
103
+ 'max-lines': 'warn',
104
+ 'max-lines-per-function': 'warn',
105
+ 'max-nested-callbacks': 'error',
106
+ 'max-params': 'off',
107
+ 'max-statements': 'warn',
108
+ 'multiline-comment-style': 'error',
109
+ 'new-cap': 'error',
83
110
  'no-alert': 'error',
111
+ 'no-array-constructor': 'error',
112
+ 'no-bitwise': 'off',
84
113
  'no-caller': 'error',
85
114
  'no-case-declarations': 'error',
86
- 'no-constructor-return': 'error',
115
+ 'no-confusing-arrow': ['error', { allowParens: false }],
116
+ 'no-console': 'warn',
117
+ 'no-continue': 'off',
118
+ 'no-delete-var': 'error',
87
119
  'no-div-regex': 'error',
88
120
  'no-else-return': 'error',
121
+ 'no-empty': 'error',
89
122
  'no-empty-function': 'error',
90
- 'no-empty-pattern': 'error',
91
123
  'no-eq-null': 'error',
92
124
  'no-eval': 'error',
93
125
  'no-extend-native': 'error',
94
126
  'no-extra-bind': 'error',
127
+ 'no-extra-boolean-cast': 'error',
95
128
  'no-extra-label': 'off',
96
- 'no-fallthrough': 'error',
129
+ 'no-extra-semi': 'error',
97
130
  'no-floating-decimal': 'error',
98
131
  'no-global-assign': 'error',
99
132
  'no-implicit-coercion': 'error',
100
133
  'no-implicit-globals': 'error',
101
134
  'no-implied-eval': 'error',
135
+ 'no-inline-comments': 'off',
102
136
  'no-invalid-this': 'error',
103
137
  'no-iterator': 'error',
138
+ 'no-label-var': 'off',
104
139
  'no-labels': 'error',
105
140
  'no-lone-blocks': 'error',
141
+ 'no-lonely-if': 'error',
106
142
  'no-loop-func': 'error',
107
143
  'no-magic-numbers': 'off',
108
- 'no-multi-spaces': 'error',
144
+ 'no-mixed-operators': 'error',
145
+ 'no-multi-assign': 'error',
109
146
  'no-multi-str': 'error',
147
+ 'no-negated-condition': 'error',
148
+ 'no-nested-ternary': 'error',
110
149
  'no-new': 'error',
111
150
  'no-new-func': 'error',
151
+ 'no-new-object': 'error',
112
152
  'no-new-wrappers': 'error',
113
153
  'no-nonoctal-decimal-escape': 'error',
114
154
  'no-octal': 'error',
115
155
  'no-octal-escape': 'error',
116
156
  'no-param-reassign': ['error', { props: false }],
157
+ 'no-plusplus': 'off',
117
158
  'no-proto': 'error',
118
159
  'no-redeclare': 'error',
160
+ 'no-regex-spaces': 'error',
161
+ 'no-restricted-exports': 'off',
162
+ 'no-restricted-globals': 'off',
163
+ 'no-restricted-imports': 'off',
119
164
  'no-restricted-properties': 'off',
165
+ 'no-restricted-syntax': 'off',
120
166
  'no-return-assign': 'error',
121
167
  'no-return-await': 'error',
122
168
  'no-script-url': 'error',
123
- 'no-self-assign': 'error',
124
- 'no-self-compare': 'error',
125
169
  'no-sequences': 'error',
170
+ 'no-shadow': 'error',
171
+ 'no-shadow-restricted-names': 'error',
172
+ 'no-ternary': 'off',
126
173
  'no-throw-literal': 'error',
127
- 'no-unmodified-loop-condition': 'error',
174
+ 'no-undef-init': 'error',
175
+ 'no-undefined': 'off',
176
+ 'no-underscore-dangle': ['error', { allowAfterThis: true }],
177
+ 'no-unneeded-ternary': ['error', { defaultAssignment: false }],
128
178
  'no-unused-expressions': ['error', { enforceForJSX: true }],
129
179
  'no-unused-labels': 'off',
130
180
  'no-useless-call': 'error',
131
181
  'no-useless-catch': 'error',
182
+ 'no-useless-computed-key': 'error',
132
183
  'no-useless-concat': 'error',
184
+ 'no-useless-constructor': 'error',
133
185
  'no-useless-escape': 'error',
186
+ 'no-useless-rename': 'error',
134
187
  'no-useless-return': 'error',
188
+ 'no-var': 'error',
135
189
  'no-void': 'error',
136
190
  'no-warning-comments': 'error',
137
191
  'no-with': 'error',
192
+ 'object-shorthand': ['error', 'always'],
193
+ 'one-var': ['error', 'never'],
194
+ 'one-var-declaration-per-line': 'off',
195
+ 'operator-assignment': 'off',
196
+ 'prefer-arrow-callback': 'error',
197
+ 'prefer-const': 'error',
198
+ 'prefer-destructuring': 'error',
199
+ 'prefer-exponentiation-operator': 'error',
138
200
  'prefer-named-capture-group': 'error',
201
+ 'prefer-numeric-literals': 'error',
202
+ 'prefer-object-has-own': 'error',
203
+ 'prefer-object-spread': 'error',
139
204
  'prefer-promise-reject-errors': 'error',
140
205
  'prefer-regex-literals': 'error',
206
+ 'prefer-rest-params': 'error',
207
+ 'prefer-spread': 'error',
208
+ 'prefer-template': 'error',
209
+ 'quote-props': ['error', 'as-needed'],
141
210
  radix: 'error',
142
211
  'require-await': 'error',
143
212
  'require-unicode-regexp': 'error',
144
- 'vars-on-top': 'error',
145
- 'wrap-iife': ['error', 'inside'],
146
- yoda: 'error'
147
- },
148
- ...{
149
- // Strict Mode
150
- strict: ['error', 'safe']
151
- },
152
- ...{
153
- // Variables
154
- 'init-declarations': 'error',
155
- 'no-delete-var': 'error',
156
- 'no-label-var': 'off',
157
- 'no-restricted-globals': 'off',
158
- 'no-shadow': 'error',
159
- 'no-shadow-restricted-names': 'error',
160
- 'no-undef': 'error',
161
- 'no-undef-init': 'error',
162
- 'no-undefined': 'off',
163
- 'no-unused-vars': [
213
+ 'require-yield': 'error',
214
+ 'sort-imports': 'error',
215
+ 'sort-keys': 'error',
216
+ 'sort-vars': 'error',
217
+ 'spaced-comment': [
164
218
  'error',
165
- {
166
- args: 'after-used',
167
- caughtErrors: 'all',
168
- vars: 'all'
169
- }
219
+ 'always',
220
+ { block: { balanced: true } }
170
221
  ],
171
- 'no-use-before-define': 'error'
222
+ strict: ['error', 'safe'],
223
+ 'symbol-description': 'error',
224
+ 'vars-on-top': 'error',
225
+ yoda: 'error'
172
226
  },
173
227
  ...{
174
- // Stylistic Issues
228
+ // Layout & Formatting
175
229
  'array-bracket-newline': 'error',
176
230
  'array-bracket-spacing': ['error', 'never'],
177
231
  'array-element-newline': [
@@ -181,14 +235,20 @@ module.exports = {
181
235
  multiline: true
182
236
  }
183
237
  ],
238
+ 'arrow-parens': ['error', 'as-needed'],
239
+ 'arrow-spacing': [
240
+ 'error',
241
+ {
242
+ after: true,
243
+ before: true
244
+ }
245
+ ],
184
246
  'block-spacing': ['error', 'always'],
185
247
  'brace-style': [
186
248
  'error',
187
249
  '1tbs',
188
250
  { allowSingleLine: false }
189
251
  ],
190
- camelcase: ['error', { properties: 'never' }],
191
- 'capitalized-comments': 'error',
192
252
  'comma-dangle': ['error', 'never'],
193
253
  'comma-spacing': [
194
254
  'error',
@@ -199,17 +259,12 @@ module.exports = {
199
259
  ],
200
260
  'comma-style': ['error', 'last'],
201
261
  'computed-property-spacing': ['error', 'never'],
202
- 'consistent-this': 'off',
262
+ 'dot-location': ['error', 'property'],
203
263
  'eol-last': 'error',
204
264
  'func-call-spacing': ['error', 'never'],
205
- 'func-name-matching': 'error',
206
- 'func-names': ['error', 'as-needed'],
207
- 'func-style': ['error', 'expression'],
208
265
  'function-call-argument-newline': ['error', 'consistent'],
209
266
  'function-paren-newline': ['error', 'multiline'],
210
- 'id-denylist': 'off',
211
- 'id-length': 'off',
212
- 'id-match': 'off',
267
+ 'generator-star-spacing': ['error', 'after'],
213
268
  'implicit-arrow-linebreak': ['error', 'beside'],
214
269
  indent: [
215
270
  'error',
@@ -238,27 +293,21 @@ module.exports = {
238
293
  'linebreak-style': 'error',
239
294
  'lines-around-comment': 'off',
240
295
  'lines-between-class-members': 'error',
241
- 'max-depth': 'error',
242
296
  'max-len': 'off',
243
- 'max-lines': 'warn',
244
- 'max-lines-per-function': 'warn',
245
- 'max-nested-callbacks': 'error',
246
- 'max-params': 'off',
247
- 'max-statements': 'warn',
248
297
  'max-statements-per-line': 'error',
249
- 'multiline-comment-style': 'error',
250
298
  'multiline-ternary': ['error', 'always-multiline'],
251
- 'new-cap': 'error',
252
299
  'new-parens': 'error',
253
300
  'newline-per-chained-call': 'off',
254
- 'no-array-constructor': 'error',
255
- 'no-bitwise': 'off',
256
- 'no-continue': 'off',
257
- 'no-inline-comments': 'off',
258
- 'no-lonely-if': 'error',
259
- 'no-mixed-operators': 'error',
301
+ 'no-extra-parens': [
302
+ 'error',
303
+ 'all',
304
+ {
305
+ ignoreJSX: 'multi-line',
306
+ nestedBinaryExpressions: false
307
+ }
308
+ ],
260
309
  'no-mixed-spaces-and-tabs': 'error',
261
- 'no-multi-assign': 'error',
310
+ 'no-multi-spaces': 'error',
262
311
  'no-multiple-empty-lines': [
263
312
  'error',
264
313
  {
@@ -267,35 +316,22 @@ module.exports = {
267
316
  maxEOF: 1
268
317
  }
269
318
  ],
270
- 'no-negated-condition': 'error',
271
- 'no-nested-ternary': 'error',
272
- 'no-new-object': 'error',
273
- 'no-plusplus': 'off',
274
- 'no-restricted-syntax': 'off',
275
319
  'no-tabs': 'off',
276
- 'no-ternary': 'off',
277
320
  'no-trailing-spaces': 'error',
278
- 'no-underscore-dangle': ['error', { allowAfterThis: true }],
279
- 'no-unneeded-ternary': ['error', { defaultAssignment: false }],
280
321
  'no-whitespace-before-property': 'error',
281
322
  'nonblock-statement-body-position': 'error',
282
323
  'object-curly-newline': ['error', { multiline: true }],
283
324
  'object-curly-spacing': ['error', 'always'],
284
325
  'object-property-newline': 'error',
285
- 'one-var': ['error', 'never'],
286
- 'one-var-declaration-per-line': 'off',
287
- 'operator-assignment': 'off',
288
326
  'operator-linebreak': ['error', 'before'],
289
327
  'padded-blocks': ['error', 'never'],
290
328
  'padding-line-between-statements': 'error',
291
- 'prefer-exponentiation-operator': 'error',
292
- 'prefer-object-spread': 'error',
293
- 'quote-props': ['error', 'as-needed'],
294
329
  quotes: [
295
330
  'error',
296
331
  'single',
297
332
  'avoid-escape'
298
333
  ],
334
+ 'rest-spread-spacing': ['error', 'never'],
299
335
  semi: ['error', 'always'],
300
336
  'semi-spacing': [
301
337
  'error',
@@ -305,62 +341,17 @@ module.exports = {
305
341
  }
306
342
  ],
307
343
  'semi-style': ['error', 'last'],
308
- 'sort-keys': 'error',
309
- 'sort-vars': 'error',
310
344
  'space-before-blocks': 'error',
311
345
  'space-before-function-paren': ['error', 'always'],
312
346
  'space-in-parens': ['error', 'never'],
313
347
  'space-infix-ops': 'error',
314
348
  'space-unary-ops': 'error',
315
- 'spaced-comment': [
316
- 'error',
317
- 'always',
318
- { block: { balanced: true } }
319
- ],
320
349
  'switch-colon-spacing': 'error',
350
+ 'template-curly-spacing': ['error', 'never'],
321
351
  'template-tag-spacing': ['error', 'never'],
322
352
  'unicode-bom': ['error', 'never'],
323
- 'wrap-regex': 'off'
324
- },
325
- ...{
326
- // ECMAScript 6
327
- 'arrow-body-style': ['error', 'as-needed'],
328
- 'arrow-parens': ['error', 'as-needed'],
329
- 'arrow-spacing': [
330
- 'error',
331
- {
332
- after: true,
333
- before: true
334
- }
335
- ],
336
- 'constructor-super': 'error',
337
- 'generator-star-spacing': ['error', 'after'],
338
- 'no-class-assign': 'error',
339
- 'no-confusing-arrow': ['error', { allowParens: false }],
340
- 'no-const-assign': 'error',
341
- 'no-dupe-class-members': 'error',
342
- 'no-duplicate-imports': 'error',
343
- 'no-new-symbol': 'error',
344
- 'no-restricted-exports': 'off',
345
- 'no-restricted-imports': 'off',
346
- 'no-this-before-super': 'error',
347
- 'no-useless-computed-key': 'error',
348
- 'no-useless-constructor': 'error',
349
- 'no-useless-rename': 'error',
350
- 'no-var': 'error',
351
- 'object-shorthand': ['error', 'always'],
352
- 'prefer-arrow-callback': 'error',
353
- 'prefer-const': 'error',
354
- 'prefer-destructuring': 'error',
355
- 'prefer-numeric-literals': 'error',
356
- 'prefer-rest-params': 'error',
357
- 'prefer-spread': 'error',
358
- 'prefer-template': 'error',
359
- 'require-yield': 'error',
360
- 'rest-spread-spacing': ['error', 'never'],
361
- 'sort-imports': 'error',
362
- 'symbol-description': 'error',
363
- 'template-curly-spacing': ['error', 'never'],
353
+ 'wrap-iife': ['error', 'inside'],
354
+ 'wrap-regex': 'off',
364
355
  'yield-star-spacing': [
365
356
  'error',
366
357
  {
package/jest.js CHANGED
@@ -10,6 +10,7 @@ module.exports = {
10
10
  'jest/no-alias-methods': 'error',
11
11
  'jest/no-commented-out-tests': 'error',
12
12
  'jest/no-conditional-expect': 'error',
13
+ 'jest/no-conditional-in-test': 'error',
13
14
  'jest/no-deprecated-functions': 'error',
14
15
  'jest/no-disabled-tests': 'error',
15
16
  'jest/no-done-callback': 'error',
@@ -18,7 +19,6 @@ module.exports = {
18
19
  'jest/no-focused-tests': 'error',
19
20
  'jest/no-hooks': 'off',
20
21
  'jest/no-identical-title': 'error',
21
- 'jest/no-if': 'error',
22
22
  'jest/no-interpolation-in-snapshots': 'error',
23
23
  'jest/no-jasmine-globals': 'error',
24
24
  'jest/no-jest-import': 'error',
@@ -29,10 +29,13 @@ module.exports = {
29
29
  'jest/no-test-prefixes': 'error',
30
30
  'jest/no-test-return-statement': 'error',
31
31
  'jest/prefer-called-with': 'error',
32
+ 'jest/prefer-comparison-matcher': 'error',
33
+ 'jest/prefer-equality-matcher': 'error',
32
34
  'jest/prefer-expect-assertions': ['warn', { onlyFunctionsWithAsyncKeyword: true }],
33
35
  'jest/prefer-expect-resolves': 'error',
34
36
  'jest/prefer-hooks-on-top': 'error',
35
37
  'jest/prefer-lowercase-title': 'error',
38
+ 'jest/prefer-snapshot-hint': 'error',
36
39
  'jest/prefer-spy-on': 'error',
37
40
  'jest/prefer-strict-equal': 'error',
38
41
  'jest/prefer-to-be': 'error',
package/jsdoc.js CHANGED
@@ -49,6 +49,7 @@ module.exports = {
49
49
  'jsdoc/require-throws': 'error',
50
50
  'jsdoc/require-yields': 'error',
51
51
  'jsdoc/require-yields-check': 'error',
52
+ 'jsdoc/sort-tags': 'error',
52
53
  'jsdoc/tag-lines': 'error',
53
54
  'jsdoc/valid-types': 'error'
54
55
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@egy186/eslint-config",
3
3
  "description": "Eslint shareable config",
4
- "version": "0.65.0",
4
+ "version": "0.69.0",
5
5
  "author": "egy186",
6
6
  "bugs": {
7
7
  "url": "https://github.com/egy186/eslint-config/issues"
@@ -10,18 +10,18 @@
10
10
  "lodash": "^4.17.21"
11
11
  },
12
12
  "devDependencies": {
13
- "@typescript-eslint/eslint-plugin": "~5.3.1",
14
- "@typescript-eslint/parser": "~5.3.1",
15
- "eslint": "~8.2.0",
16
- "eslint-plugin-import": "~2.25.3",
17
- "eslint-plugin-jest": "~25.2.4",
18
- "eslint-plugin-jsdoc": "~37.0.3",
13
+ "@typescript-eslint/eslint-plugin": "~5.11.0",
14
+ "@typescript-eslint/parser": "~5.11.0",
15
+ "eslint": "~8.9.0",
16
+ "eslint-plugin-import": "~2.25.4",
17
+ "eslint-plugin-jest": "~26.1.0",
18
+ "eslint-plugin-jsdoc": "~37.9.1",
19
19
  "eslint-plugin-node": "~11.1.0",
20
- "eslint-plugin-react": "~7.27.0",
20
+ "eslint-plugin-react": "~7.28.0",
21
21
  "eslint-plugin-react-hooks": "~4.3.0",
22
- "husky": "^7.0.1",
22
+ "husky": "^7.0.4",
23
23
  "require-dir": "^1.2.0",
24
- "typescript": "^4.4.4"
24
+ "typescript": "^4.5.5"
25
25
  },
26
26
  "engines": {
27
27
  "node": ">=12.22.0"
@@ -47,10 +47,10 @@
47
47
  "peerDependencies": {
48
48
  "@typescript-eslint/eslint-plugin": "^5.3.1",
49
49
  "@typescript-eslint/parser": "^5.3.1",
50
- "eslint": "^8.2.0",
50
+ "eslint": "^8.9.0",
51
51
  "eslint-plugin-import": "^2.25.3",
52
- "eslint-plugin-jest": "^25.2.4",
53
- "eslint-plugin-jsdoc": "^37.0.3",
52
+ "eslint-plugin-jest": "^26.1.0",
53
+ "eslint-plugin-jsdoc": "^37.8.0",
54
54
  "eslint-plugin-node": "^11.1.0",
55
55
  "eslint-plugin-react": "^7.27.0",
56
56
  "eslint-plugin-react-hooks": "^4.3.0",