eslint 4.16.0 → 4.18.2

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 (89) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/conf/environments.js +3 -1
  3. package/conf/eslint-recommended.js +0 -0
  4. package/lib/linter.js +368 -366
  5. package/lib/rules/accessor-pairs.js +7 -3
  6. package/lib/rules/array-bracket-newline.js +11 -5
  7. package/lib/rules/array-bracket-spacing.js +11 -5
  8. package/lib/rules/array-callback-return.js +11 -5
  9. package/lib/rules/array-element-newline.js +8 -3
  10. package/lib/rules/arrow-body-style.js +16 -8
  11. package/lib/rules/arrow-parens.js +13 -9
  12. package/lib/rules/arrow-spacing.js +13 -5
  13. package/lib/rules/block-scoped-var.js +6 -2
  14. package/lib/rules/block-spacing.js +13 -6
  15. package/lib/rules/brace-style.js +16 -14
  16. package/lib/rules/callback-return.js +6 -2
  17. package/lib/rules/camelcase.js +6 -2
  18. package/lib/rules/capitalized-comments.js +11 -8
  19. package/lib/rules/class-methods-use-this.js +7 -3
  20. package/lib/rules/comma-dangle.js +7 -4
  21. package/lib/rules/comma-spacing.js +13 -10
  22. package/lib/rules/comma-style.js +9 -4
  23. package/lib/rules/complexity.js +6 -2
  24. package/lib/rules/computed-property-spacing.js +13 -5
  25. package/lib/rules/consistent-return.js +12 -7
  26. package/lib/rules/consistent-this.js +9 -4
  27. package/lib/rules/constructor-super.js +17 -8
  28. package/lib/rules/curly.js +59 -80
  29. package/lib/rules/default-case.js +6 -2
  30. package/lib/rules/dot-location.js +8 -3
  31. package/lib/rules/dot-notation.js +10 -5
  32. package/lib/rules/eol-last.js +7 -3
  33. package/lib/rules/eqeqeq.js +6 -2
  34. package/lib/rules/indent.js +0 -1
  35. package/lib/rules/key-spacing.js +3 -2
  36. package/lib/rules/keyword-spacing.js +6 -1
  37. package/lib/rules/max-len.js +2 -1
  38. package/lib/rules/no-alert.js +19 -18
  39. package/lib/rules/no-array-constructor.js +6 -2
  40. package/lib/rules/no-await-in-loop.js +75 -57
  41. package/lib/rules/no-bitwise.js +6 -2
  42. package/lib/rules/no-buffer-constructor.js +6 -3
  43. package/lib/rules/no-caller.js +6 -2
  44. package/lib/rules/no-case-declarations.js +6 -2
  45. package/lib/rules/no-catch-shadow.js +6 -2
  46. package/lib/rules/no-class-assign.js +6 -2
  47. package/lib/rules/no-compare-neg-zero.js +5 -2
  48. package/lib/rules/no-cond-assign.js +10 -4
  49. package/lib/rules/no-confusing-arrow.js +6 -2
  50. package/lib/rules/no-console.js +6 -2
  51. package/lib/rules/no-const-assign.js +6 -2
  52. package/lib/rules/no-constant-condition.js +6 -3
  53. package/lib/rules/no-continue.js +6 -2
  54. package/lib/rules/no-control-regex.js +7 -3
  55. package/lib/rules/no-debugger.js +5 -2
  56. package/lib/rules/no-delete-var.js +6 -2
  57. package/lib/rules/no-div-regex.js +6 -2
  58. package/lib/rules/no-dupe-args.js +6 -2
  59. package/lib/rules/no-dupe-class-members.js +6 -2
  60. package/lib/rules/no-dupe-keys.js +6 -2
  61. package/lib/rules/no-duplicate-case.js +6 -2
  62. package/lib/rules/no-else-return.js +7 -2
  63. package/lib/rules/no-empty-character-class.js +6 -2
  64. package/lib/rules/no-empty-function.js +6 -2
  65. package/lib/rules/no-empty-pattern.js +7 -3
  66. package/lib/rules/no-empty.js +7 -3
  67. package/lib/rules/no-eq-null.js +6 -2
  68. package/lib/rules/no-eval.js +6 -2
  69. package/lib/rules/no-ex-assign.js +6 -2
  70. package/lib/rules/no-extend-native.js +6 -2
  71. package/lib/rules/no-extra-bind.js +6 -2
  72. package/lib/rules/no-extra-boolean-cast.js +8 -3
  73. package/lib/rules/no-extra-label.js +6 -2
  74. package/lib/rules/no-extra-parens.js +5 -1
  75. package/lib/rules/no-extra-semi.js +6 -2
  76. package/lib/rules/no-self-assign.js +3 -1
  77. package/lib/rules/no-unused-vars.js +1 -1
  78. package/lib/rules/object-curly-newline.js +67 -19
  79. package/lib/rules/object-shorthand.js +9 -7
  80. package/lib/rules/padding-line-between-statements.js +6 -0
  81. package/lib/rules/require-await.js +5 -0
  82. package/lib/rules/rest-spread-spacing.js +6 -0
  83. package/lib/rules/space-unary-ops.js +1 -10
  84. package/lib/rules/template-tag-spacing.js +0 -0
  85. package/lib/util/glob-util.js +17 -4
  86. package/lib/util/interpolate.js +5 -1
  87. package/lib/util/npm-util.js +1 -1
  88. package/package.json +2 -2
  89. package/conf/default-config-options.js +0 -29
@@ -18,7 +18,11 @@ module.exports = {
18
18
  url: "https://eslint.org/docs/rules/no-control-regex"
19
19
  },
20
20
 
21
- schema: []
21
+ schema: [],
22
+
23
+ messages: {
24
+ unexpected: "Unexpected control character(s) in regular expression: {{controlChars}}."
25
+ }
22
26
  },
23
27
 
24
28
  create(context) {
@@ -26,7 +30,7 @@ module.exports = {
26
30
  /**
27
31
  * Get the regex expression
28
32
  * @param {ASTNode} node node to evaluate
29
- * @returns {*} Regex if found else null
33
+ * @returns {RegExp|null} Regex if found else null
30
34
  * @private
31
35
  */
32
36
  function getRegExp(node) {
@@ -114,7 +118,7 @@ module.exports = {
114
118
  if (controlCharacters.length > 0) {
115
119
  context.report({
116
120
  node,
117
- message: "Unexpected control character(s) in regular expression: {{controlChars}}.",
121
+ messageId: "unexpected",
118
122
  data: {
119
123
  controlChars: controlCharacters.join(", ")
120
124
  }
@@ -20,7 +20,10 @@ module.exports = {
20
20
  url: "https://eslint.org/docs/rules/no-debugger"
21
21
  },
22
22
  fixable: "code",
23
- schema: []
23
+ schema: [],
24
+ messages: {
25
+ unexpected: "Unexpected 'debugger' statement."
26
+ }
24
27
  },
25
28
 
26
29
  create(context) {
@@ -29,7 +32,7 @@ module.exports = {
29
32
  DebuggerStatement(node) {
30
33
  context.report({
31
34
  node,
32
- message: "Unexpected 'debugger' statement.",
35
+ messageId: "unexpected",
33
36
  fix(fixer) {
34
37
  if (astUtils.STATEMENT_LIST_PARENTS.has(node.parent.type)) {
35
38
  return fixer.remove(node);
@@ -18,7 +18,11 @@ module.exports = {
18
18
  url: "https://eslint.org/docs/rules/no-delete-var"
19
19
  },
20
20
 
21
- schema: []
21
+ schema: [],
22
+
23
+ messages: {
24
+ unexpected: "Variables should not be deleted."
25
+ }
22
26
  },
23
27
 
24
28
  create(context) {
@@ -27,7 +31,7 @@ module.exports = {
27
31
 
28
32
  UnaryExpression(node) {
29
33
  if (node.operator === "delete" && node.argument.type === "Identifier") {
30
- context.report({ node, message: "Variables should not be deleted." });
34
+ context.report({ node, messageId: "unexpected" });
31
35
  }
32
36
  }
33
37
  };
@@ -18,7 +18,11 @@ module.exports = {
18
18
  url: "https://eslint.org/docs/rules/no-div-regex"
19
19
  },
20
20
 
21
- schema: []
21
+ schema: [],
22
+
23
+ messages: {
24
+ unexpected: "A regular expression literal can be confused with '/='."
25
+ }
22
26
  },
23
27
 
24
28
  create(context) {
@@ -30,7 +34,7 @@ module.exports = {
30
34
  const token = sourceCode.getFirstToken(node);
31
35
 
32
36
  if (token.type === "RegularExpression" && token.value[1] === "=") {
33
- context.report({ node, message: "A regular expression literal can be confused with '/='." });
37
+ context.report({ node, messageId: "unexpected" });
34
38
  }
35
39
  }
36
40
  };
@@ -18,7 +18,11 @@ module.exports = {
18
18
  url: "https://eslint.org/docs/rules/no-dupe-args"
19
19
  },
20
20
 
21
- schema: []
21
+ schema: [],
22
+
23
+ messages: {
24
+ unexpected: "Duplicate param '{{name}}'."
25
+ }
22
26
  },
23
27
 
24
28
  create(context) {
@@ -54,7 +58,7 @@ module.exports = {
54
58
  if (defs.length >= 2) {
55
59
  context.report({
56
60
  node,
57
- message: "Duplicate param '{{name}}'.",
61
+ messageId: "unexpected",
58
62
  data: { name: variable.name }
59
63
  });
60
64
  }
@@ -18,7 +18,11 @@ module.exports = {
18
18
  url: "https://eslint.org/docs/rules/no-dupe-class-members"
19
19
  },
20
20
 
21
- schema: []
21
+ schema: [],
22
+
23
+ messages: {
24
+ unexpected: "Duplicate name '{{name}}'."
25
+ }
22
26
  },
23
27
 
24
28
  create(context) {
@@ -102,7 +106,7 @@ module.exports = {
102
106
  }
103
107
 
104
108
  if (isDuplicate) {
105
- context.report({ node, message: "Duplicate name '{{name}}'.", data: { name } });
109
+ context.report({ node, messageId: "unexpected", data: { name } });
106
110
  }
107
111
  }
108
112
  };
@@ -91,7 +91,11 @@ module.exports = {
91
91
  url: "https://eslint.org/docs/rules/no-dupe-keys"
92
92
  },
93
93
 
94
- schema: []
94
+ schema: [],
95
+
96
+ messages: {
97
+ unexpected: "Duplicate key '{{name}}'."
98
+ }
95
99
  },
96
100
 
97
101
  create(context) {
@@ -123,7 +127,7 @@ module.exports = {
123
127
  context.report({
124
128
  node: info.node,
125
129
  loc: node.key.loc,
126
- message: "Duplicate key '{{name}}'.",
130
+ messageId: "unexpected",
127
131
  data: { name }
128
132
  });
129
133
  }
@@ -19,7 +19,11 @@ module.exports = {
19
19
  url: "https://eslint.org/docs/rules/no-duplicate-case"
20
20
  },
21
21
 
22
- schema: []
22
+ schema: [],
23
+
24
+ messages: {
25
+ unexpected: "Duplicate case label."
26
+ }
23
27
  },
24
28
 
25
29
  create(context) {
@@ -33,7 +37,7 @@ module.exports = {
33
37
  const key = sourceCode.getText(switchCase.test);
34
38
 
35
39
  if (mapping[key]) {
36
- context.report({ node: switchCase, message: "Duplicate case label." });
40
+ context.report({ node: switchCase, messageId: "unexpected" });
37
41
  } else {
38
42
  mapping[key] = switchCase;
39
43
  }
@@ -34,7 +34,12 @@ module.exports = {
34
34
  },
35
35
  additionalProperties: false
36
36
  }],
37
- fixable: "code"
37
+
38
+ fixable: "code",
39
+
40
+ messages: {
41
+ unexpected: "Unnecessary 'else' after 'return'."
42
+ }
38
43
  },
39
44
 
40
45
  create(context) {
@@ -52,7 +57,7 @@ module.exports = {
52
57
  function displayReport(node) {
53
58
  context.report({
54
59
  node,
55
- message: "Unnecessary 'else' after 'return'.",
60
+ messageId: "unexpected",
56
61
  fix: fixer => {
57
62
  const sourceCode = context.getSourceCode();
58
63
  const startToken = sourceCode.getFirstToken(node);
@@ -36,7 +36,11 @@ module.exports = {
36
36
  url: "https://eslint.org/docs/rules/no-empty-character-class"
37
37
  },
38
38
 
39
- schema: []
39
+ schema: [],
40
+
41
+ messages: {
42
+ unexpected: "Empty class."
43
+ }
40
44
  },
41
45
 
42
46
  create(context) {
@@ -48,7 +52,7 @@ module.exports = {
48
52
  const token = sourceCode.getFirstToken(node);
49
53
 
50
54
  if (token.type === "RegularExpression" && !regex.test(token.value)) {
51
- context.report({ node, message: "Empty class." });
55
+ context.report({ node, messageId: "unexpected" });
52
56
  }
53
57
  }
54
58
 
@@ -109,7 +109,11 @@ module.exports = {
109
109
  },
110
110
  additionalProperties: false
111
111
  }
112
- ]
112
+ ],
113
+
114
+ messages: {
115
+ unexpected: "Unexpected empty {{name}}."
116
+ }
113
117
  },
114
118
 
115
119
  create(context) {
@@ -146,7 +150,7 @@ module.exports = {
146
150
  context.report({
147
151
  node,
148
152
  loc: node.body.loc.start,
149
- message: "Unexpected empty {{name}}.",
153
+ messageId: "unexpected",
150
154
  data: { name }
151
155
  });
152
156
  }
@@ -17,19 +17,23 @@ module.exports = {
17
17
  url: "https://eslint.org/docs/rules/no-empty-pattern"
18
18
  },
19
19
 
20
- schema: []
20
+ schema: [],
21
+
22
+ messages: {
23
+ unexpected: "Unexpected empty {{type}} pattern."
24
+ }
21
25
  },
22
26
 
23
27
  create(context) {
24
28
  return {
25
29
  ObjectPattern(node) {
26
30
  if (node.properties.length === 0) {
27
- context.report({ node, message: "Unexpected empty object pattern." });
31
+ context.report({ node, messageId: "unexpected", data: { type: "object" } });
28
32
  }
29
33
  },
30
34
  ArrayPattern(node) {
31
35
  if (node.elements.length === 0) {
32
- context.report({ node, message: "Unexpected empty array pattern." });
36
+ context.report({ node, messageId: "unexpected", data: { type: "array" } });
33
37
  }
34
38
  }
35
39
  };
@@ -33,7 +33,11 @@ module.exports = {
33
33
  },
34
34
  additionalProperties: false
35
35
  }
36
- ]
36
+ ],
37
+
38
+ messages: {
39
+ unexpected: "Empty {{type}} statement."
40
+ }
37
41
  },
38
42
 
39
43
  create(context) {
@@ -64,13 +68,13 @@ module.exports = {
64
68
  return;
65
69
  }
66
70
 
67
- context.report({ node, message: "Empty block statement." });
71
+ context.report({ node, messageId: "unexpected", data: { type: "block" } });
68
72
  },
69
73
 
70
74
  SwitchStatement(node) {
71
75
 
72
76
  if (typeof node.cases === "undefined" || node.cases.length === 0) {
73
- context.report({ node, message: "Empty switch statement." });
77
+ context.report({ node, messageId: "unexpected", data: { type: "switch" } });
74
78
  }
75
79
  }
76
80
  };
@@ -19,7 +19,11 @@ module.exports = {
19
19
  url: "https://eslint.org/docs/rules/no-eq-null"
20
20
  },
21
21
 
22
- schema: []
22
+ schema: [],
23
+
24
+ messages: {
25
+ unexpected: "Use '===' to compare with null."
26
+ }
23
27
  },
24
28
 
25
29
  create(context) {
@@ -31,7 +35,7 @@ module.exports = {
31
35
 
32
36
  if (node.right.type === "Literal" && node.right.raw === "null" && badOperator ||
33
37
  node.left.type === "Literal" && node.left.raw === "null" && badOperator) {
34
- context.report({ node, message: "Use '===' to compare with null." });
38
+ context.report({ node, messageId: "unexpected" });
35
39
  }
36
40
  }
37
41
  };
@@ -91,7 +91,11 @@ module.exports = {
91
91
  },
92
92
  additionalProperties: false
93
93
  }
94
- ]
94
+ ],
95
+
96
+ messages: {
97
+ unexpected: "eval can be harmful."
98
+ }
95
99
  },
96
100
 
97
101
  create(context) {
@@ -160,7 +164,7 @@ module.exports = {
160
164
  context.report({
161
165
  node,
162
166
  loc: locationNode.loc.start,
163
- message: "eval can be harmful."
167
+ messageId: "unexpected"
164
168
  });
165
169
  }
166
170
 
@@ -20,7 +20,11 @@ module.exports = {
20
20
  url: "https://eslint.org/docs/rules/no-ex-assign"
21
21
  },
22
22
 
23
- schema: []
23
+ schema: [],
24
+
25
+ messages: {
26
+ unexpected: "Do not assign to the exception parameter."
27
+ }
24
28
  },
25
29
 
26
30
  create(context) {
@@ -32,7 +36,7 @@ module.exports = {
32
36
  */
33
37
  function checkVariable(variable) {
34
38
  astUtils.getModifyingReferences(variable.references).forEach(reference => {
35
- context.report({ node: reference.identifier, message: "Do not assign to the exception parameter." });
39
+ context.report({ node: reference.identifier, messageId: "unexpected" });
36
40
  });
37
41
  }
38
42
 
@@ -45,7 +45,11 @@ module.exports = {
45
45
  },
46
46
  additionalProperties: false
47
47
  }
48
- ]
48
+ ],
49
+
50
+ messages: {
51
+ unexpected: "{{builtin}} prototype is read only, properties should not be added."
52
+ }
49
53
  },
50
54
 
51
55
  create(context) {
@@ -67,7 +71,7 @@ module.exports = {
67
71
  function reportNode(node, builtin) {
68
72
  context.report({
69
73
  node,
70
- message: "{{builtin}} prototype is read only, properties should not be added.",
74
+ messageId: "unexpected",
71
75
  data: {
72
76
  builtin
73
77
  }
@@ -25,7 +25,11 @@ module.exports = {
25
25
 
26
26
  schema: [],
27
27
 
28
- fixable: "code"
28
+ fixable: "code",
29
+
30
+ messages: {
31
+ unexpected: "The function binding is unnecessary."
32
+ }
29
33
  },
30
34
 
31
35
  create(context) {
@@ -41,7 +45,7 @@ module.exports = {
41
45
  function report(node) {
42
46
  context.report({
43
47
  node: node.parent.parent,
44
- message: "The function binding is unnecessary.",
48
+ messageId: "unexpected",
45
49
  loc: node.parent.property.loc.start,
46
50
  fix(fixer) {
47
51
  const firstTokenToRemove = context.getSourceCode()
@@ -26,7 +26,12 @@ module.exports = {
26
26
 
27
27
  schema: [],
28
28
 
29
- fixable: "code"
29
+ fixable: "code",
30
+
31
+ messages: {
32
+ unexpectedCall: "Redundant Boolean call.",
33
+ unexpectedNegation: "Redundant double negation."
34
+ }
30
35
  },
31
36
 
32
37
  create(context) {
@@ -82,7 +87,7 @@ module.exports = {
82
87
  ) {
83
88
  context.report({
84
89
  node,
85
- message: "Redundant double negation.",
90
+ messageId: "unexpectedNegation",
86
91
  fix: fixer => fixer.replaceText(parent, sourceCode.getText(node.argument))
87
92
  });
88
93
  }
@@ -97,7 +102,7 @@ module.exports = {
97
102
  if (isInBooleanContext(node, parent)) {
98
103
  context.report({
99
104
  node,
100
- message: "Redundant Boolean call.",
105
+ messageId: "unexpectedCall",
101
106
  fix: fixer => {
102
107
  if (!node.arguments.length) {
103
108
  return fixer.replaceText(parent, "true");
@@ -26,7 +26,11 @@ module.exports = {
26
26
 
27
27
  schema: [],
28
28
 
29
- fixable: "code"
29
+ fixable: "code",
30
+
31
+ messages: {
32
+ unexpected: "This label '{{name}}' is unnecessary."
33
+ }
30
34
  },
31
35
 
32
36
  create(context) {
@@ -109,7 +113,7 @@ module.exports = {
109
113
  if (info.breakable && info.label && info.label.name === labelNode.name) {
110
114
  context.report({
111
115
  node: labelNode,
112
- message: "This label '{{name}}' is unnecessary.",
116
+ messageId: "unexpected",
113
117
  data: labelNode,
114
118
  fix: fixer => fixer.removeRange([sourceCode.getFirstToken(node).range[1], labelNode.range[1]])
115
119
  });
@@ -55,6 +55,10 @@ module.exports = {
55
55
  maxItems: 2
56
56
  }
57
57
  ]
58
+ },
59
+
60
+ messages: {
61
+ unexpected: "Gratuitous parentheses around expression."
58
62
  }
59
63
  },
60
64
 
@@ -312,7 +316,7 @@ module.exports = {
312
316
  context.report({
313
317
  node,
314
318
  loc: leftParenToken.loc.start,
315
- message: "Gratuitous parentheses around expression.",
319
+ messageId: "unexpected",
316
320
  fix(fixer) {
317
321
  const parenthesizedSource = sourceCode.text.slice(leftParenToken.range[1], rightParenToken.range[0]);
318
322
 
@@ -26,7 +26,11 @@ module.exports = {
26
26
  },
27
27
 
28
28
  fixable: "code",
29
- schema: []
29
+ schema: [],
30
+
31
+ messages: {
32
+ unexpected: "Unnecessary semicolon."
33
+ }
30
34
  },
31
35
 
32
36
  create(context) {
@@ -40,7 +44,7 @@ module.exports = {
40
44
  function report(nodeOrToken) {
41
45
  context.report({
42
46
  node: nodeOrToken,
43
- message: "Unnecessary semicolon.",
47
+ messageId: "unexpected",
44
48
  fix(fixer) {
45
49
 
46
50
  /*
@@ -121,7 +121,9 @@ function eachSelfAssignment(left, right, props, report) {
121
121
  let startJ = 0;
122
122
 
123
123
  for (let i = right.properties.length - 1; i >= 0; --i) {
124
- if (right.properties[i].type === "ExperimentalSpreadProperty") {
124
+ const propType = right.properties[i].type;
125
+
126
+ if (propType === "SpreadElement" || propType === "ExperimentalSpreadProperty") {
125
127
  startJ = i + 1;
126
128
  break;
127
129
  }
@@ -65,7 +65,7 @@ module.exports = {
65
65
  create(context) {
66
66
  const sourceCode = context.getSourceCode();
67
67
 
68
- const REST_PROPERTY_TYPE = /^(?:Experimental)?RestProperty$/;
68
+ const REST_PROPERTY_TYPE = /^(?:RestElement|(?:Experimental)?RestProperty)$/;
69
69
 
70
70
  const config = {
71
71
  vars: "all",