@croct/eslint-plugin 0.7.1 → 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.
@@ -4,7 +4,6 @@ exports.javascript = void 0;
4
4
  exports.javascript = {
5
5
  extends: [
6
6
  'plugin:jest/recommended',
7
- 'airbnb-base',
8
7
  'plugin:eslint-comments/recommended',
9
8
  ],
10
9
  plugins: [
@@ -15,12 +14,22 @@ exports.javascript = {
15
14
  'newline-destructuring',
16
15
  '@croct',
17
16
  ],
17
+ parserOptions: {
18
+ ecmaVersion: 2018,
19
+ sourceType: 'module',
20
+ },
21
+ env: {
22
+ es6: true,
23
+ node: true,
24
+ },
18
25
  rules: {
26
+ // Custom rules
19
27
  '@croct/argument-spacing': 'error',
20
28
  '@croct/complex-expression-spacing': 'error',
21
29
  '@croct/newline-per-chained-call': 'error',
22
30
  '@croct/min-chained-call-depth': 'error',
23
31
  '@croct/parameter-destructuring': 'error',
32
+ // ESLint comments rules
24
33
  'eslint-comments/disable-enable-pair': [
25
34
  'error',
26
35
  {
@@ -29,92 +38,344 @@ exports.javascript = {
29
38
  ],
30
39
  'eslint-comments/require-description': 'error',
31
40
  'eslint-comments/no-unused-disable': 'error',
32
- 'newline-per-chained-call': 'off',
33
- 'no-plusplus': 'off',
34
- 'array-bracket-newline': [
35
- 'error',
36
- 'consistent',
37
- ],
38
- 'multiline-ternary': [
39
- 'error',
40
- 'always-multiline',
41
- ],
42
- 'no-undef-init': 'error',
43
- 'jest/consistent-test-it': [
44
- 'error',
45
- {
46
- fn: 'it',
47
- },
48
- ],
49
- 'jest/no-large-snapshots': 'off',
50
- 'jest/prefer-expect-resolves': 'error',
51
- 'jest/prefer-lowercase-title': [
52
- 'error',
53
- {
54
- ignore: ['describe'],
55
- },
56
- ],
57
- 'jest/prefer-spy-on': 'error',
58
- 'jest/require-top-level-describe': 'error',
59
- 'jest/prefer-to-contain': 'error',
60
- 'jest/prefer-hooks-on-top': 'error',
61
- 'jest/prefer-equality-matcher': 'error',
62
- 'jest/no-test-return-statement': 'error',
63
- 'function-call-argument-newline': [
64
- 'error',
65
- 'consistent',
66
- ],
67
- 'no-underscore-dangle': 'off',
68
- 'import/no-default-export': 'error',
69
- 'array-element-newline': [
70
- 'error',
71
- 'consistent',
72
- ],
73
- 'import-newlines/enforce': [
74
- 'error',
75
- {
76
- items: 6,
77
- 'max-len': 120,
78
- },
79
- ],
80
- 'no-smart-quotes/no-smart-quotes': 'error',
81
- 'no-shadow': 'error',
82
- 'import/prefer-default-export': 'off',
83
- 'import/no-extraneous-dependencies': 'off',
84
- 'no-use-before-define': [
85
- 'error',
86
- {
87
- functions: false,
88
- },
89
- ],
90
- 'arrow-parens': [
91
- 'error',
92
- 'as-needed',
93
- ],
41
+ // Best practices (from airbnb-base)
42
+ 'accessor-pairs': 'off',
43
+ 'array-callback-return': ['error', { allowImplicit: true }],
44
+ 'block-scoped-var': 'error',
45
+ complexity: ['off', 20],
94
46
  'class-methods-use-this': 'off',
95
47
  'consistent-return': 'off',
48
+ curly: ['error', 'multi-line'],
96
49
  'default-case': 'off',
97
- 'import/extensions': [
98
- 'error',
99
- 'never',
100
- {
101
- d: 'always',
102
- json: 'always',
103
- },
104
- ],
105
- 'import/no-unresolved': 'off',
50
+ 'default-case-last': 'error',
51
+ 'default-param-last': 'error',
52
+ 'dot-notation': ['error', { allowKeywords: true }],
53
+ 'dot-location': ['error', 'property'],
54
+ eqeqeq: ['error', 'always', { null: 'ignore' }],
55
+ 'grouped-accessor-pairs': 'error',
56
+ 'guard-for-in': 'error',
57
+ 'max-classes-per-file': 'off',
58
+ 'no-alert': 'warn',
59
+ 'no-caller': 'error',
60
+ 'no-case-declarations': 'error',
61
+ 'no-constructor-return': 'error',
62
+ 'no-div-regex': 'off',
63
+ 'no-else-return': ['error', { allowElseIf: false }],
64
+ 'no-empty-function': ['error', {
65
+ allow: [
66
+ 'arrowFunctions',
67
+ 'functions',
68
+ 'methods',
69
+ ],
70
+ }],
71
+ 'no-empty-pattern': 'error',
72
+ 'no-eq-null': 'off',
73
+ 'no-eval': 'error',
74
+ 'no-extend-native': 'error',
75
+ 'no-extra-bind': 'error',
76
+ 'no-extra-label': 'error',
77
+ 'no-fallthrough': 'error',
78
+ 'no-floating-decimal': 'error',
79
+ 'no-global-assign': ['error', { exceptions: [] }],
80
+ 'no-native-reassign': 'off',
81
+ 'no-implicit-coercion': ['off', {
82
+ boolean: false,
83
+ number: true,
84
+ string: true,
85
+ allow: [],
86
+ }],
87
+ 'no-implicit-globals': 'off',
88
+ 'no-implied-eval': 'error',
89
+ 'no-invalid-this': 'off',
90
+ 'no-iterator': 'error',
91
+ 'no-labels': ['error', { allowLoop: false, allowSwitch: false }],
92
+ 'no-lone-blocks': 'error',
93
+ 'no-loop-func': 'error',
94
+ 'no-magic-numbers': ['off', {
95
+ ignore: [],
96
+ ignoreArrayIndexes: true,
97
+ enforceConst: true,
98
+ detectObjects: false,
99
+ }],
100
+ 'no-multi-spaces': ['error', {
101
+ ignoreEOLComments: false,
102
+ }],
103
+ 'no-multi-str': 'error',
104
+ 'no-new': 'error',
105
+ 'no-new-func': 'error',
106
+ 'no-new-wrappers': 'error',
107
+ 'no-nonoctal-decimal-escape': 'error',
108
+ 'no-octal': 'error',
109
+ 'no-octal-escape': 'error',
110
+ 'no-param-reassign': ['error', {
111
+ props: true,
112
+ ignorePropertyModificationsFor: [
113
+ 'acc',
114
+ 'accumulator',
115
+ 'e',
116
+ 'ctx',
117
+ 'context',
118
+ 'req',
119
+ 'request',
120
+ 'res',
121
+ 'response',
122
+ '$scope',
123
+ 'staticContext',
124
+ ],
125
+ }],
126
+ 'no-proto': 'error',
127
+ 'no-redeclare': 'error',
128
+ 'no-restricted-properties': ['error', {
129
+ object: 'arguments',
130
+ property: 'callee',
131
+ message: 'arguments.callee is deprecated',
132
+ }, {
133
+ object: 'global',
134
+ property: 'isFinite',
135
+ message: 'Please use Number.isFinite instead',
136
+ }, {
137
+ object: 'self',
138
+ property: 'isFinite',
139
+ message: 'Please use Number.isFinite instead',
140
+ }, {
141
+ object: 'window',
142
+ property: 'isFinite',
143
+ message: 'Please use Number.isFinite instead',
144
+ }, {
145
+ object: 'global',
146
+ property: 'isNaN',
147
+ message: 'Please use Number.isNaN instead',
148
+ }, {
149
+ object: 'self',
150
+ property: 'isNaN',
151
+ message: 'Please use Number.isNaN instead',
152
+ }, {
153
+ object: 'window',
154
+ property: 'isNaN',
155
+ message: 'Please use Number.isNaN instead',
156
+ }, {
157
+ property: '__defineGetter__',
158
+ message: 'Please use Object.defineProperty instead.',
159
+ }, {
160
+ property: '__defineSetter__',
161
+ message: 'Please use Object.defineProperty instead.',
162
+ }, {
163
+ object: 'Math',
164
+ property: 'pow',
165
+ message: 'Use the exponentiation operator (**) instead.',
166
+ }],
167
+ 'no-return-assign': ['error', 'always'],
168
+ 'no-return-await': 'error',
169
+ 'no-script-url': 'error',
170
+ 'no-self-assign': ['error', {
171
+ props: true,
172
+ }],
173
+ 'no-self-compare': 'error',
174
+ 'no-sequences': 'error',
175
+ 'no-throw-literal': 'error',
176
+ 'no-unmodified-loop-condition': 'off',
177
+ 'no-unused-expressions': 'error',
178
+ 'no-unused-labels': 'error',
179
+ 'no-useless-call': 'off',
180
+ 'no-useless-catch': 'error',
181
+ 'no-useless-concat': 'error',
182
+ 'no-useless-escape': 'error',
183
+ 'no-useless-return': 'error',
184
+ 'no-void': 'error',
185
+ 'no-warning-comments': ['off', { terms: ['todo', 'fixme', 'xxx'], location: 'start' }],
186
+ 'no-with': 'error',
187
+ 'prefer-promise-reject-errors': ['error', { allowEmptyReject: true }],
188
+ 'prefer-named-capture-group': 'off',
189
+ 'prefer-regex-literals': ['error', {
190
+ disallowRedundantWrapping: true,
191
+ }],
192
+ radix: 'error',
193
+ 'require-await': 'error',
194
+ 'require-unicode-regexp': 'off',
195
+ 'vars-on-top': 'error',
196
+ 'wrap-iife': ['error', 'outside', { functionPrototypeMethods: false }],
197
+ yoda: 'error',
198
+ // Errors (from airbnb-base)
199
+ 'for-direction': 'error',
200
+ 'getter-return': ['error', { allowImplicit: true }],
201
+ 'no-async-promise-executor': 'error',
202
+ 'no-await-in-loop': 'off',
203
+ 'no-compare-neg-zero': 'error',
204
+ 'no-cond-assign': ['error', 'always'],
205
+ 'no-console': 'warn',
206
+ 'no-constant-condition': 'warn',
207
+ 'no-control-regex': 'error',
208
+ 'no-debugger': 'error',
209
+ 'no-dupe-args': 'error',
210
+ 'no-dupe-else-if': 'error',
211
+ 'no-dupe-keys': 'error',
212
+ 'no-duplicate-case': 'error',
213
+ 'no-empty': 'error',
214
+ 'no-empty-character-class': 'error',
215
+ 'no-ex-assign': 'error',
216
+ 'no-extra-boolean-cast': 'error',
217
+ 'no-extra-parens': ['off', 'all', {
218
+ conditionalAssign: true,
219
+ nestedBinaryExpressions: false,
220
+ returnAssign: false,
221
+ ignoreJSX: 'all',
222
+ enforceForArrowConditionals: false,
223
+ }],
224
+ 'no-extra-semi': 'error',
225
+ 'no-func-assign': 'error',
226
+ 'no-import-assign': 'error',
227
+ 'no-inner-declarations': 'error',
228
+ 'no-invalid-regexp': 'error',
229
+ 'no-irregular-whitespace': 'error',
230
+ 'no-loss-of-precision': 'error',
231
+ 'no-misleading-character-class': 'error',
232
+ 'no-obj-calls': 'error',
233
+ 'no-promise-executor-return': 'error',
234
+ 'no-prototype-builtins': 'error',
235
+ 'no-regex-spaces': 'error',
236
+ 'no-setter-return': 'error',
237
+ 'no-sparse-arrays': 'error',
238
+ 'no-template-curly-in-string': 'error',
239
+ 'no-unexpected-multiline': 'error',
240
+ 'no-unreachable': 'error',
241
+ 'no-unreachable-loop': ['error', {
242
+ ignore: [],
243
+ }],
244
+ 'no-unsafe-finally': 'error',
245
+ 'no-unsafe-negation': 'error',
246
+ 'no-unsafe-optional-chaining': ['error', { disallowArithmeticOperators: true }],
247
+ 'no-unused-private-class-members': 'off',
248
+ 'no-useless-backreference': 'error',
249
+ 'no-negated-in-lhs': 'off',
250
+ 'require-atomic-updates': 'off',
251
+ 'use-isnan': 'error',
252
+ 'valid-jsdoc': 'off',
253
+ 'valid-typeof': ['error', { requireStringLiterals: true }],
254
+ // Style (from airbnb-base, with customizations)
255
+ 'array-bracket-newline': ['error', 'consistent'],
256
+ 'array-element-newline': ['error', 'consistent'],
257
+ 'array-bracket-spacing': ['error', 'never'],
258
+ 'block-spacing': ['error', 'always'],
259
+ 'brace-style': ['error', '1tbs', { allowSingleLine: true }],
260
+ camelcase: ['error', { properties: 'never', ignoreDestructuring: false }],
261
+ 'capitalized-comments': ['off', 'never', {
262
+ line: {
263
+ ignorePattern: '.*',
264
+ ignoreInlineComments: true,
265
+ ignoreConsecutiveComments: true,
266
+ },
267
+ block: {
268
+ ignorePattern: '.*',
269
+ ignoreInlineComments: true,
270
+ ignoreConsecutiveComments: true,
271
+ },
272
+ }],
273
+ 'comma-dangle': ['error', {
274
+ arrays: 'always-multiline',
275
+ objects: 'always-multiline',
276
+ imports: 'always-multiline',
277
+ exports: 'always-multiline',
278
+ functions: 'always-multiline',
279
+ }],
280
+ 'comma-spacing': ['error', { before: false, after: true }],
281
+ 'comma-style': ['error', 'last', {
282
+ exceptions: {
283
+ ArrayExpression: false,
284
+ ArrayPattern: false,
285
+ ArrowFunctionExpression: false,
286
+ CallExpression: false,
287
+ FunctionDeclaration: false,
288
+ FunctionExpression: false,
289
+ ImportDeclaration: false,
290
+ ObjectExpression: false,
291
+ ObjectPattern: false,
292
+ VariableDeclaration: false,
293
+ NewExpression: false,
294
+ },
295
+ }],
296
+ 'computed-property-spacing': ['error', 'never'],
297
+ 'consistent-this': 'off',
298
+ 'eol-last': ['error', 'always'],
299
+ 'function-call-argument-newline': ['error', 'consistent'],
300
+ 'func-call-spacing': ['error', 'never'],
301
+ 'func-name-matching': ['off', 'always', {
302
+ includeCommonJSModuleExports: false,
303
+ considerPropertyDescriptor: true,
304
+ }],
305
+ 'func-names': 'warn',
306
+ 'func-style': ['off', 'expression'],
307
+ 'function-paren-newline': ['error', 'multiline-arguments'],
308
+ 'id-denylist': 'off',
309
+ 'id-length': 'off',
310
+ 'id-match': 'off',
311
+ 'implicit-arrow-linebreak': ['error', 'beside'],
106
312
  indent: [
107
313
  'error',
108
314
  4,
109
315
  {
110
316
  SwitchCase: 1,
317
+ VariableDeclarator: 1,
318
+ outerIIFEBody: 1,
319
+ FunctionDeclaration: {
320
+ parameters: 1,
321
+ body: 1,
322
+ },
323
+ FunctionExpression: {
324
+ parameters: 1,
325
+ body: 1,
326
+ },
327
+ CallExpression: {
328
+ arguments: 1,
329
+ },
330
+ ArrayExpression: 1,
331
+ ObjectExpression: 1,
332
+ ImportDeclaration: 1,
333
+ flatTernaryExpressions: false,
334
+ ignoredNodes: [
335
+ 'JSXElement',
336
+ 'JSXElement > *',
337
+ 'JSXAttribute',
338
+ 'JSXIdentifier',
339
+ 'JSXNamespacedName',
340
+ 'JSXMemberExpression',
341
+ 'JSXSpreadAttribute',
342
+ 'JSXExpressionContainer',
343
+ 'JSXOpeningElement',
344
+ 'JSXClosingElement',
345
+ 'JSXFragment',
346
+ 'JSXOpeningFragment',
347
+ 'JSXClosingFragment',
348
+ 'JSXText',
349
+ 'JSXEmptyExpression',
350
+ 'JSXSpreadChild',
351
+ ],
352
+ ignoreComments: false,
111
353
  },
112
354
  ],
113
- 'linebreak-style': [
114
- 'error',
115
- 'unix',
116
- ],
117
- 'max-classes-per-file': 'off',
355
+ 'jsx-quotes': ['error', 'prefer-double'],
356
+ 'key-spacing': ['error', { beforeColon: false, afterColon: true }],
357
+ 'keyword-spacing': ['error', {
358
+ before: true,
359
+ after: true,
360
+ overrides: {
361
+ return: { after: true },
362
+ throw: { after: true },
363
+ case: { after: true },
364
+ },
365
+ }],
366
+ 'line-comment-position': ['off', {
367
+ position: 'above',
368
+ ignorePattern: '',
369
+ applyDefaultPatterns: true,
370
+ }],
371
+ 'linebreak-style': ['error', 'unix'],
372
+ 'lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: false }],
373
+ 'lines-around-comment': 'off',
374
+ 'lines-around-directive': ['error', {
375
+ before: 'always',
376
+ after: 'always',
377
+ }],
378
+ 'max-depth': ['off', 4],
118
379
  'max-len': [
119
380
  'error',
120
381
  {
@@ -126,9 +387,54 @@ exports.javascript = {
126
387
  ignoreUrls: false,
127
388
  },
128
389
  ],
129
- 'no-await-in-loop': 'off',
390
+ 'max-lines': ['off', {
391
+ max: 300,
392
+ skipBlankLines: true,
393
+ skipComments: true,
394
+ }],
395
+ 'max-lines-per-function': ['off', {
396
+ max: 50,
397
+ skipBlankLines: true,
398
+ skipComments: true,
399
+ IIFEs: true,
400
+ }],
401
+ 'max-nested-callbacks': 'off',
402
+ 'max-params': ['off', 3],
403
+ 'max-statements': ['off', 10],
404
+ 'max-statements-per-line': ['off', { max: 1 }],
405
+ 'multiline-comment-style': ['off', 'starred-block'],
406
+ 'multiline-ternary': ['error', 'always-multiline'],
407
+ 'new-cap': ['error', {
408
+ newIsCap: true,
409
+ newIsCapExceptions: [],
410
+ capIsNew: false,
411
+ capIsNewExceptions: ['Immutable.Map', 'Immutable.Set', 'Immutable.List'],
412
+ }],
413
+ 'new-parens': 'error',
414
+ 'newline-after-var': 'off',
415
+ 'newline-before-return': 'off',
416
+ 'newline-per-chained-call': 'off',
417
+ 'no-array-constructor': 'error',
130
418
  'no-bitwise': 'off',
131
419
  'no-continue': 'off',
420
+ 'no-inline-comments': 'off',
421
+ 'no-lonely-if': 'error',
422
+ 'no-mixed-operators': ['error', {
423
+ groups: [
424
+ ['%', '**'],
425
+ ['%', '+'],
426
+ ['%', '-'],
427
+ ['%', '*'],
428
+ ['%', '/'],
429
+ ['/', '*'],
430
+ ['&', '|', '<<', '>>', '>>>'],
431
+ ['==', '!=', '===', '!=='],
432
+ ['&&', '||'],
433
+ ],
434
+ allowSamePrecedence: false,
435
+ }],
436
+ 'no-mixed-spaces-and-tabs': 'error',
437
+ 'no-multi-assign': ['error'],
132
438
  'no-multiple-empty-lines': [
133
439
  'error',
134
440
  {
@@ -137,20 +443,28 @@ exports.javascript = {
137
443
  maxBOF: 0,
138
444
  },
139
445
  ],
140
- 'no-unused-expressions': 'error',
141
- 'no-unused-vars': [
142
- 'error',
143
- {
144
- args: 'after-used',
145
- ignoreRestSiblings: true,
146
- },
147
- ],
446
+ 'no-negated-condition': 'off',
447
+ 'no-nested-ternary': 'error',
448
+ 'no-new-object': 'error',
449
+ 'no-plusplus': 'off',
148
450
  'no-restricted-syntax': [
149
451
  'error',
150
452
  'ForInStatement',
151
453
  'LabeledStatement',
152
454
  'WithStatement',
153
455
  ],
456
+ 'no-spaced-func': 'error',
457
+ 'no-tabs': 'error',
458
+ 'no-ternary': 'off',
459
+ 'no-trailing-spaces': ['error', {
460
+ skipBlankLines: false,
461
+ ignoreComments: false,
462
+ }],
463
+ 'no-underscore-dangle': 'off',
464
+ 'no-unneeded-ternary': ['error', { defaultAssignment: false }],
465
+ 'no-whitespace-before-property': 'error',
466
+ 'nonblock-statement-body-position': ['error', 'beside', { overrides: {} }],
467
+ 'object-curly-spacing': ['error', 'never'],
154
468
  'object-curly-newline': [
155
469
  'error',
156
470
  {
@@ -158,15 +472,20 @@ exports.javascript = {
158
472
  consistent: true,
159
473
  },
160
474
  ],
161
- 'object-curly-spacing': [
162
- 'error',
163
- 'never',
164
- ],
165
- 'require-await': 'error',
166
- 'object-shorthand': [
167
- 'error',
168
- 'never',
169
- ],
475
+ 'object-property-newline': ['error', {
476
+ allowAllPropertiesOnSameLine: true,
477
+ }],
478
+ 'one-var': ['error', 'never'],
479
+ 'one-var-declaration-per-line': ['error', 'always'],
480
+ 'operator-assignment': ['error', 'always'],
481
+ 'operator-linebreak': ['error', 'before', { overrides: { '=': 'none' } }],
482
+ 'padded-blocks': ['error', {
483
+ blocks: 'never',
484
+ classes: 'never',
485
+ switches: 'never',
486
+ }, {
487
+ allowSingleLineBlocks: true,
488
+ }],
170
489
  'padding-line-between-statements': [
171
490
  'error',
172
491
  {
@@ -232,7 +551,300 @@ exports.javascript = {
232
551
  ],
233
552
  },
234
553
  ],
235
- 'no-useless-escape': 'error',
554
+ 'prefer-exponentiation-operator': 'error',
555
+ 'prefer-object-spread': 'error',
556
+ 'quote-props': ['error', 'as-needed', { keywords: false, unnecessary: true, numbers: false }],
557
+ quotes: ['error', 'single', { avoidEscape: true }],
558
+ 'require-jsdoc': 'off',
559
+ semi: ['error', 'always'],
560
+ 'semi-spacing': ['error', { before: false, after: true }],
561
+ 'semi-style': ['error', 'last'],
562
+ 'sort-keys': ['off', 'asc', { caseSensitive: false, natural: true }],
563
+ 'sort-vars': 'off',
564
+ 'space-before-blocks': 'error',
565
+ 'space-before-function-paren': ['error', {
566
+ anonymous: 'always',
567
+ named: 'never',
568
+ asyncArrow: 'always',
569
+ }],
570
+ 'space-in-parens': ['error', 'never'],
571
+ 'space-infix-ops': 'error',
572
+ 'space-unary-ops': ['error', {
573
+ words: true,
574
+ nonwords: false,
575
+ overrides: {},
576
+ }],
577
+ 'spaced-comment': ['error', 'always', {
578
+ line: {
579
+ exceptions: ['-', '+'],
580
+ markers: ['=', '!', '/'],
581
+ },
582
+ block: {
583
+ exceptions: ['-', '+'],
584
+ markers: ['=', '!', ':', '::'],
585
+ balanced: true,
586
+ },
587
+ }],
588
+ 'switch-colon-spacing': ['error', { after: true, before: false }],
589
+ 'template-tag-spacing': ['error', 'never'],
590
+ 'unicode-bom': ['error', 'never'],
591
+ 'wrap-regex': 'off',
592
+ // ES6 (from airbnb-base)
593
+ 'arrow-body-style': ['error', 'as-needed', {
594
+ requireReturnForObjectLiteral: false,
595
+ }],
596
+ 'arrow-parens': ['error', 'as-needed'],
597
+ 'arrow-spacing': ['error', { before: true, after: true }],
598
+ 'constructor-super': 'error',
599
+ 'generator-star-spacing': ['error', { before: false, after: true }],
600
+ 'no-class-assign': 'error',
601
+ 'no-confusing-arrow': ['error', {
602
+ allowParens: true,
603
+ }],
604
+ 'no-const-assign': 'error',
605
+ 'no-dupe-class-members': 'error',
606
+ 'no-duplicate-imports': 'off',
607
+ 'no-new-symbol': 'error',
608
+ 'no-restricted-exports': ['error', {
609
+ restrictedNamedExports: [
610
+ 'default',
611
+ 'then',
612
+ ],
613
+ }],
614
+ 'no-restricted-imports': ['off', {
615
+ paths: [],
616
+ patterns: [],
617
+ }],
618
+ 'no-this-before-super': 'error',
619
+ 'no-useless-computed-key': 'error',
620
+ 'no-useless-constructor': 'error',
621
+ 'no-useless-rename': ['error', {
622
+ ignoreDestructuring: false,
623
+ ignoreImport: false,
624
+ ignoreExport: false,
625
+ }],
626
+ 'no-var': 'error',
627
+ 'object-shorthand': ['error', 'never'],
628
+ 'prefer-arrow-callback': ['error', {
629
+ allowNamedFunctions: false,
630
+ allowUnboundThis: true,
631
+ }],
632
+ 'prefer-const': ['error', {
633
+ destructuring: 'any',
634
+ ignoreReadBeforeAssign: true,
635
+ }],
636
+ 'prefer-destructuring': ['error', {
637
+ VariableDeclarator: {
638
+ array: false,
639
+ object: true,
640
+ },
641
+ AssignmentExpression: {
642
+ array: true,
643
+ object: false,
644
+ },
645
+ }, {
646
+ enforceForRenamedProperties: false,
647
+ }],
648
+ 'prefer-numeric-literals': 'error',
649
+ 'prefer-reflect': 'off',
650
+ 'prefer-rest-params': 'error',
651
+ 'prefer-spread': 'error',
652
+ 'prefer-template': 'error',
653
+ 'require-yield': 'error',
654
+ 'rest-spread-spacing': ['error', 'never'],
655
+ 'sort-imports': ['off', {
656
+ ignoreCase: false,
657
+ ignoreDeclarationSort: false,
658
+ ignoreMemberSort: false,
659
+ memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'],
660
+ }],
661
+ 'symbol-description': 'error',
662
+ 'template-curly-spacing': 'error',
663
+ 'yield-star-spacing': ['error', 'after'],
664
+ // Variables (from airbnb-base)
665
+ 'init-declarations': 'off',
666
+ 'no-catch-shadow': 'off',
667
+ 'no-delete-var': 'error',
668
+ 'no-label-var': 'error',
669
+ 'no-restricted-globals': [
670
+ 'error',
671
+ {
672
+ name: 'isFinite',
673
+ message: 'Use Number.isFinite instead https://github.com/airbnb/javascript#standard-library--isfinite',
674
+ },
675
+ {
676
+ name: 'isNaN',
677
+ message: 'Use Number.isNaN instead https://github.com/airbnb/javascript#standard-library--isnan',
678
+ },
679
+ 'addEventListener',
680
+ 'blur',
681
+ 'close',
682
+ 'closed',
683
+ 'confirm',
684
+ 'defaultStatus',
685
+ 'defaultstatus',
686
+ 'event',
687
+ 'external',
688
+ 'find',
689
+ 'focus',
690
+ 'frameElement',
691
+ 'frames',
692
+ 'history',
693
+ 'innerHeight',
694
+ 'innerWidth',
695
+ 'length',
696
+ 'location',
697
+ 'locationbar',
698
+ 'menubar',
699
+ 'moveBy',
700
+ 'moveTo',
701
+ 'name',
702
+ 'onblur',
703
+ 'onerror',
704
+ 'onfocus',
705
+ 'onload',
706
+ 'onresize',
707
+ 'onunload',
708
+ 'open',
709
+ 'opener',
710
+ 'opera',
711
+ 'outerHeight',
712
+ 'outerWidth',
713
+ 'pageXOffset',
714
+ 'pageYOffset',
715
+ 'parent',
716
+ 'print',
717
+ 'removeEventListener',
718
+ 'resizeBy',
719
+ 'resizeTo',
720
+ 'screen',
721
+ 'screenLeft',
722
+ 'screenTop',
723
+ 'screenX',
724
+ 'screenY',
725
+ 'scroll',
726
+ 'scrollbars',
727
+ 'scrollBy',
728
+ 'scrollTo',
729
+ 'scrollX',
730
+ 'scrollY',
731
+ 'self',
732
+ 'status',
733
+ 'statusbar',
734
+ 'stop',
735
+ 'toolbar',
736
+ 'top',
737
+ ],
738
+ 'no-shadow': 'error',
739
+ 'no-shadow-restricted-names': 'error',
740
+ 'no-undef': 'error',
741
+ 'no-undef-init': 'error',
742
+ 'no-undefined': 'off',
743
+ 'no-unused-vars': [
744
+ 'error',
745
+ {
746
+ args: 'after-used',
747
+ ignoreRestSiblings: true,
748
+ },
749
+ ],
750
+ 'no-use-before-define': [
751
+ 'error',
752
+ {
753
+ functions: false,
754
+ },
755
+ ],
756
+ // Strict (from airbnb-base)
757
+ strict: ['error', 'never'],
758
+ // Node (from airbnb-base)
759
+ 'callback-return': 'off',
760
+ 'global-require': 'error',
761
+ 'handle-callback-err': 'off',
762
+ 'no-buffer-constructor': 'error',
763
+ 'no-mixed-requires': ['off', false],
764
+ 'no-new-require': 'error',
765
+ 'no-path-concat': 'error',
766
+ 'no-process-env': 'off',
767
+ 'no-process-exit': 'off',
768
+ 'no-restricted-modules': 'off',
769
+ 'no-sync': 'off',
770
+ // Import rules (from airbnb-base)
771
+ 'import/no-unresolved': 'off',
772
+ 'import/named': 'error',
773
+ 'import/default': 'off',
774
+ 'import/namespace': 'off',
775
+ 'import/export': 'error',
776
+ 'import/no-named-as-default': 'error',
777
+ 'import/no-named-as-default-member': 'error',
778
+ 'import/no-deprecated': 'off',
779
+ 'import/no-extraneous-dependencies': 'off',
780
+ 'import/no-mutable-exports': 'error',
781
+ 'import/no-commonjs': 'off',
782
+ 'import/no-amd': 'error',
783
+ 'import/no-nodejs-modules': 'off',
784
+ 'import/first': 'error',
785
+ 'import/imports-first': 'off',
786
+ 'import/no-duplicates': 'error',
787
+ 'import/no-namespace': 'off',
788
+ 'import/extensions': [
789
+ 'error',
790
+ 'never',
791
+ {
792
+ d: 'always',
793
+ json: 'always',
794
+ },
795
+ ],
796
+ 'import/order': ['error', { groups: [['builtin', 'external', 'internal']] }],
797
+ 'import/newline-after-import': 'error',
798
+ 'import/prefer-default-export': 'off',
799
+ 'import/no-restricted-paths': 'off',
800
+ 'import/max-dependencies': ['off', { max: 10 }],
801
+ 'import/no-absolute-path': 'error',
802
+ 'import/no-dynamic-require': 'error',
803
+ 'import/no-internal-modules': ['off', {
804
+ allow: [],
805
+ }],
806
+ 'import/unambiguous': 'off',
807
+ 'import/no-webpack-loader-syntax': 'error',
808
+ 'import/no-unassigned-import': 'off',
809
+ 'import/no-named-default': 'error',
810
+ 'import/no-anonymous-default-export': ['off', {
811
+ allowArray: false,
812
+ allowArrowFunction: false,
813
+ allowAnonymousClass: false,
814
+ allowAnonymousFunction: false,
815
+ allowLiteral: false,
816
+ allowObject: false,
817
+ }],
818
+ 'import/exports-last': 'off',
819
+ 'import/group-exports': 'off',
820
+ 'import/no-default-export': 'error',
821
+ 'import/no-named-export': 'off',
822
+ 'import/no-self-import': 'error',
823
+ 'import/no-cycle': ['error', { maxDepth: Infinity }],
824
+ 'import/no-useless-path-segments': ['error', { commonjs: true }],
825
+ 'import/dynamic-import-chunkname': ['off', {
826
+ importFunctions: [],
827
+ webpackChunknameFormat: '[0-9a-zA-Z-_/.]+',
828
+ }],
829
+ 'import/no-relative-parent-imports': 'off',
830
+ 'import/no-unused-modules': ['off', {
831
+ ignoreExports: [],
832
+ missingExports: true,
833
+ unusedExports: true,
834
+ }],
835
+ 'import/no-import-module-exports': ['error', {
836
+ exceptions: [],
837
+ }],
838
+ 'import/no-relative-packages': 'error',
839
+ // Custom plugin rules
840
+ 'import-newlines/enforce': [
841
+ 'error',
842
+ {
843
+ items: 6,
844
+ 'max-len': 120,
845
+ },
846
+ ],
847
+ 'no-smart-quotes/no-smart-quotes': 'error',
236
848
  'newline-destructuring/newline': [
237
849
  'error',
238
850
  {
@@ -241,10 +853,27 @@ exports.javascript = {
241
853
  items: Infinity,
242
854
  },
243
855
  ],
244
- 'jsx-quotes': [
856
+ // Jest rules
857
+ 'jest/consistent-test-it': [
245
858
  'error',
246
- 'prefer-double',
859
+ {
860
+ fn: 'it',
861
+ },
247
862
  ],
863
+ 'jest/no-large-snapshots': 'off',
864
+ 'jest/prefer-expect-resolves': 'error',
865
+ 'jest/prefer-lowercase-title': [
866
+ 'error',
867
+ {
868
+ ignore: ['describe'],
869
+ },
870
+ ],
871
+ 'jest/prefer-spy-on': 'error',
872
+ 'jest/require-top-level-describe': 'error',
873
+ 'jest/prefer-to-contain': 'error',
874
+ 'jest/prefer-hooks-on-top': 'error',
875
+ 'jest/prefer-equality-matcher': 'error',
876
+ 'jest/no-test-return-statement': 'error',
248
877
  },
249
878
  overrides: [
250
879
  {