eslint 0.22.0 → 0.24.1

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 (201) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +111 -95
  3. package/bin/eslint.js +41 -41
  4. package/conf/environments.js +87 -81
  5. package/conf/eslint.json +186 -179
  6. package/lib/api.js +13 -12
  7. package/lib/cli-engine.js +441 -451
  8. package/lib/cli.js +196 -196
  9. package/lib/config-initializer.js +145 -145
  10. package/lib/config-validator.js +110 -110
  11. package/lib/config.js +428 -416
  12. package/lib/eslint.js +1072 -1073
  13. package/lib/file-finder.js +167 -167
  14. package/lib/formatters/checkstyle.js +68 -68
  15. package/lib/formatters/compact.js +53 -53
  16. package/lib/formatters/jslint-xml.js +40 -40
  17. package/lib/formatters/junit.js +63 -63
  18. package/lib/formatters/stylish.js +90 -90
  19. package/lib/formatters/tap.js +86 -86
  20. package/lib/ignored-paths.js +137 -137
  21. package/lib/load-rules.js +39 -39
  22. package/lib/options.js +132 -126
  23. package/lib/rule-context.js +107 -107
  24. package/lib/rules/accessor-pairs.js +65 -65
  25. package/lib/rules/array-bracket-spacing.js +180 -0
  26. package/lib/rules/block-scoped-var.js +339 -320
  27. package/lib/rules/brace-style.js +228 -228
  28. package/lib/rules/camelcase.js +111 -111
  29. package/lib/rules/comma-dangle.js +67 -64
  30. package/lib/rules/comma-spacing.js +191 -191
  31. package/lib/rules/comma-style.js +195 -195
  32. package/lib/rules/complexity.js +94 -94
  33. package/lib/rules/computed-property-spacing.js +144 -0
  34. package/lib/rules/consistent-return.js +75 -75
  35. package/lib/rules/consistent-this.js +119 -119
  36. package/lib/rules/constructor-super.js +108 -0
  37. package/lib/rules/curly.js +109 -109
  38. package/lib/rules/default-case.js +66 -66
  39. package/lib/rules/dot-location.js +63 -63
  40. package/lib/rules/dot-notation.js +119 -119
  41. package/lib/rules/eol-last.js +38 -38
  42. package/lib/rules/eqeqeq.js +96 -96
  43. package/lib/rules/func-names.js +45 -45
  44. package/lib/rules/func-style.js +49 -49
  45. package/lib/rules/generator-star-spacing.js +104 -87
  46. package/lib/rules/generator-star.js +76 -76
  47. package/lib/rules/global-strict.js +49 -49
  48. package/lib/rules/guard-for-in.js +32 -32
  49. package/lib/rules/handle-callback-err.js +81 -124
  50. package/lib/rules/indent.js +486 -486
  51. package/lib/rules/key-spacing.js +325 -325
  52. package/lib/rules/linebreak-style.js +44 -44
  53. package/lib/rules/lines-around-comment.js +228 -160
  54. package/lib/rules/max-depth.js +89 -89
  55. package/lib/rules/max-len.js +76 -76
  56. package/lib/rules/max-nested-callbacks.js +73 -73
  57. package/lib/rules/max-params.js +45 -45
  58. package/lib/rules/max-statements.js +61 -61
  59. package/lib/rules/new-cap.js +224 -224
  60. package/lib/rules/new-parens.js +29 -29
  61. package/lib/rules/newline-after-var.js +127 -127
  62. package/lib/rules/no-alert.js +153 -153
  63. package/lib/rules/no-array-constructor.js +31 -31
  64. package/lib/rules/no-bitwise.js +57 -57
  65. package/lib/rules/no-caller.js +29 -29
  66. package/lib/rules/no-catch-shadow.js +52 -52
  67. package/lib/rules/no-comma-dangle.js +45 -45
  68. package/lib/rules/no-cond-assign.js +123 -123
  69. package/lib/rules/no-console.js +27 -27
  70. package/lib/rules/no-constant-condition.js +73 -73
  71. package/lib/rules/no-continue.js +23 -23
  72. package/lib/rules/no-control-regex.js +58 -58
  73. package/lib/rules/no-debugger.js +22 -22
  74. package/lib/rules/no-delete-var.js +25 -25
  75. package/lib/rules/no-div-regex.js +27 -27
  76. package/lib/rules/no-dupe-args.js +89 -85
  77. package/lib/rules/no-dupe-keys.js +43 -43
  78. package/lib/rules/no-duplicate-case.js +67 -67
  79. package/lib/rules/no-else-return.js +125 -125
  80. package/lib/rules/no-empty-character-class.js +43 -43
  81. package/lib/rules/no-empty-class.js +45 -45
  82. package/lib/rules/no-empty-label.js +27 -27
  83. package/lib/rules/no-empty.js +49 -49
  84. package/lib/rules/no-eq-null.js +29 -29
  85. package/lib/rules/no-eval.js +26 -26
  86. package/lib/rules/no-ex-assign.js +42 -42
  87. package/lib/rules/no-extend-native.js +103 -103
  88. package/lib/rules/no-extra-bind.js +81 -81
  89. package/lib/rules/no-extra-boolean-cast.js +71 -71
  90. package/lib/rules/no-extra-parens.js +368 -355
  91. package/lib/rules/no-extra-semi.js +70 -23
  92. package/lib/rules/no-extra-strict.js +86 -86
  93. package/lib/rules/no-fallthrough.js +97 -97
  94. package/lib/rules/no-floating-decimal.js +30 -30
  95. package/lib/rules/no-func-assign.js +83 -83
  96. package/lib/rules/no-implied-eval.js +76 -76
  97. package/lib/rules/no-inline-comments.js +49 -49
  98. package/lib/rules/no-inner-declarations.js +78 -78
  99. package/lib/rules/no-invalid-regexp.js +53 -53
  100. package/lib/rules/no-irregular-whitespace.js +135 -135
  101. package/lib/rules/no-iterator.js +28 -28
  102. package/lib/rules/no-label-var.js +64 -64
  103. package/lib/rules/no-labels.js +44 -44
  104. package/lib/rules/no-lone-blocks.js +106 -27
  105. package/lib/rules/no-lonely-if.js +30 -30
  106. package/lib/rules/no-loop-func.js +58 -58
  107. package/lib/rules/no-mixed-requires.js +165 -165
  108. package/lib/rules/no-mixed-spaces-and-tabs.js +74 -74
  109. package/lib/rules/no-multi-spaces.js +119 -119
  110. package/lib/rules/no-multi-str.js +43 -43
  111. package/lib/rules/no-multiple-empty-lines.js +98 -98
  112. package/lib/rules/no-native-reassign.js +62 -62
  113. package/lib/rules/no-negated-in-lhs.js +25 -25
  114. package/lib/rules/no-nested-ternary.js +24 -24
  115. package/lib/rules/no-new-func.js +25 -25
  116. package/lib/rules/no-new-object.js +25 -25
  117. package/lib/rules/no-new-require.js +25 -25
  118. package/lib/rules/no-new-wrappers.js +26 -26
  119. package/lib/rules/no-new.js +27 -27
  120. package/lib/rules/no-obj-calls.js +28 -28
  121. package/lib/rules/no-octal-escape.js +39 -39
  122. package/lib/rules/no-octal.js +25 -25
  123. package/lib/rules/no-param-reassign.js +87 -87
  124. package/lib/rules/no-path-concat.js +39 -39
  125. package/lib/rules/no-plusplus.js +24 -24
  126. package/lib/rules/no-process-env.js +30 -30
  127. package/lib/rules/no-process-exit.js +33 -33
  128. package/lib/rules/no-proto.js +28 -28
  129. package/lib/rules/no-redeclare.js +68 -68
  130. package/lib/rules/no-regex-spaces.js +35 -35
  131. package/lib/rules/no-reserved-keys.js +56 -56
  132. package/lib/rules/no-restricted-modules.js +85 -85
  133. package/lib/rules/no-return-assign.js +53 -24
  134. package/lib/rules/no-script-url.js +34 -34
  135. package/lib/rules/no-self-compare.js +29 -29
  136. package/lib/rules/no-sequences.js +94 -94
  137. package/lib/rules/no-shadow-restricted-names.js +51 -51
  138. package/lib/rules/no-shadow.js +181 -136
  139. package/lib/rules/no-space-before-semi.js +98 -98
  140. package/lib/rules/no-spaced-func.js +37 -37
  141. package/lib/rules/no-sparse-arrays.js +33 -33
  142. package/lib/rules/no-sync.js +30 -30
  143. package/lib/rules/no-ternary.js +24 -24
  144. package/lib/rules/no-this-before-super.js +144 -0
  145. package/lib/rules/no-throw-literal.js +33 -33
  146. package/lib/rules/no-trailing-spaces.js +74 -63
  147. package/lib/rules/no-undef-init.js +28 -28
  148. package/lib/rules/no-undef.js +92 -92
  149. package/lib/rules/no-undefined.js +27 -27
  150. package/lib/rules/no-underscore-dangle.js +73 -73
  151. package/lib/rules/no-unexpected-multiline.js +58 -0
  152. package/lib/rules/no-unneeded-ternary.js +48 -48
  153. package/lib/rules/no-unreachable.js +98 -98
  154. package/lib/rules/no-unused-expressions.js +76 -76
  155. package/lib/rules/no-unused-vars.js +252 -250
  156. package/lib/rules/no-use-before-define.js +105 -105
  157. package/lib/rules/no-var.js +26 -26
  158. package/lib/rules/no-void.js +28 -28
  159. package/lib/rules/no-warning-comments.js +102 -102
  160. package/lib/rules/no-with.js +22 -22
  161. package/lib/rules/no-wrap-func.js +65 -65
  162. package/lib/rules/object-curly-spacing.js +231 -206
  163. package/lib/rules/object-shorthand.js +74 -73
  164. package/lib/rules/one-var.js +311 -304
  165. package/lib/rules/operator-assignment.js +118 -118
  166. package/lib/rules/operator-linebreak.js +114 -114
  167. package/lib/rules/padded-blocks.js +98 -98
  168. package/lib/rules/prefer-const.js +91 -0
  169. package/lib/rules/quote-props.js +72 -72
  170. package/lib/rules/quotes.js +92 -92
  171. package/lib/rules/radix.js +41 -41
  172. package/lib/rules/semi-spacing.js +167 -167
  173. package/lib/rules/semi.js +136 -136
  174. package/lib/rules/sort-vars.js +49 -49
  175. package/lib/rules/space-after-function-name.js +49 -49
  176. package/lib/rules/space-after-keywords.js +82 -82
  177. package/lib/rules/space-before-blocks.js +91 -91
  178. package/lib/rules/space-before-function-paren.js +139 -139
  179. package/lib/rules/space-before-function-parentheses.js +139 -139
  180. package/lib/rules/space-in-brackets.js +305 -305
  181. package/lib/rules/space-in-parens.js +281 -281
  182. package/lib/rules/space-infix-ops.js +106 -106
  183. package/lib/rules/space-return-throw-case.js +38 -38
  184. package/lib/rules/space-unary-ops.js +124 -133
  185. package/lib/rules/spaced-comment.js +143 -0
  186. package/lib/rules/spaced-line-comment.js +89 -89
  187. package/lib/rules/strict.js +242 -242
  188. package/lib/rules/use-isnan.js +26 -26
  189. package/lib/rules/valid-jsdoc.js +215 -215
  190. package/lib/rules/valid-typeof.js +42 -42
  191. package/lib/rules/vars-on-top.js +115 -115
  192. package/lib/rules/wrap-iife.js +48 -48
  193. package/lib/rules/wrap-regex.js +38 -38
  194. package/lib/rules/yoda.js +242 -225
  195. package/lib/rules.js +88 -88
  196. package/lib/timing.js +109 -109
  197. package/lib/token-store.js +201 -201
  198. package/lib/util/traverse.js +105 -105
  199. package/lib/util.js +125 -85
  200. package/package.json +6 -6
  201. package/CHANGELOG.md +0 -1638
@@ -1,119 +1,119 @@
1
- /**
2
- * @fileoverview Rule to warn about using dot notation instead of square bracket notation when possible.
3
- * @author Josh Perez
4
- */
5
- "use strict";
6
-
7
- //------------------------------------------------------------------------------
8
- // Rule Definition
9
- //------------------------------------------------------------------------------
10
-
11
- var validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
12
- var keywords = [
13
- "this",
14
- "function",
15
- "if",
16
- "return",
17
- "var",
18
- "else",
19
- "for",
20
- "new",
21
- "in",
22
- "typeof",
23
- "while",
24
- "case",
25
- "break",
26
- "try",
27
- "catch",
28
- "delete",
29
- "throw",
30
- "switch",
31
- "continue",
32
- "default",
33
- "instanceof",
34
- "do",
35
- "void",
36
- "finally",
37
- "with",
38
- "debugger",
39
- "implements",
40
- "interface",
41
- "package",
42
- "private",
43
- "protected",
44
- "public",
45
- "static",
46
- "class",
47
- "enum",
48
- "export",
49
- "extends",
50
- "import",
51
- "super",
52
- "true",
53
- "false",
54
- "null",
55
- "abstract",
56
- "boolean",
57
- "byte",
58
- "char",
59
- "const",
60
- "double",
61
- "final",
62
- "float",
63
- "goto",
64
- "int",
65
- "long",
66
- "native",
67
- "short",
68
- "synchronized",
69
- "throws",
70
- "transient",
71
- "volatile"
72
- ];
73
-
74
- module.exports = function(context) {
75
- var options = context.options[0] || {};
76
- var allowKeywords = options.allowKeywords === void 0 || !!options.allowKeywords;
77
-
78
- var allowPattern;
79
- if (options.allowPattern) {
80
- allowPattern = new RegExp(options.allowPattern);
81
- }
82
-
83
- return {
84
- "MemberExpression": function(node) {
85
- if (
86
- node.computed &&
87
- node.property.type === "Literal" &&
88
- validIdentifier.test(node.property.value) &&
89
- (allowKeywords || keywords.indexOf("" + node.property.value) === -1)
90
- ) {
91
- if (!(allowPattern && allowPattern.test(node.property.value))) {
92
- context.report(node, "[" + JSON.stringify(node.property.value) + "] is better written in dot notation.");
93
- }
94
- }
95
- if (
96
- !allowKeywords &&
97
- !node.computed &&
98
- keywords.indexOf("" + node.property.name) !== -1
99
- ) {
100
- context.report(node, "." + node.property.name + " is a syntax error.");
101
- }
102
- }
103
- };
104
- };
105
-
106
- module.exports.schema = [
107
- {
108
- "type": "object",
109
- "properties": {
110
- "allowKeywords": {
111
- "type": "boolean"
112
- },
113
- "allowPattern": {
114
- "type": "string"
115
- }
116
- },
117
- "additionalProperties": false
118
- }
119
- ];
1
+ /**
2
+ * @fileoverview Rule to warn about using dot notation instead of square bracket notation when possible.
3
+ * @author Josh Perez
4
+ */
5
+ "use strict";
6
+
7
+ //------------------------------------------------------------------------------
8
+ // Rule Definition
9
+ //------------------------------------------------------------------------------
10
+
11
+ var validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
12
+ var keywords = [
13
+ "this",
14
+ "function",
15
+ "if",
16
+ "return",
17
+ "var",
18
+ "else",
19
+ "for",
20
+ "new",
21
+ "in",
22
+ "typeof",
23
+ "while",
24
+ "case",
25
+ "break",
26
+ "try",
27
+ "catch",
28
+ "delete",
29
+ "throw",
30
+ "switch",
31
+ "continue",
32
+ "default",
33
+ "instanceof",
34
+ "do",
35
+ "void",
36
+ "finally",
37
+ "with",
38
+ "debugger",
39
+ "implements",
40
+ "interface",
41
+ "package",
42
+ "private",
43
+ "protected",
44
+ "public",
45
+ "static",
46
+ "class",
47
+ "enum",
48
+ "export",
49
+ "extends",
50
+ "import",
51
+ "super",
52
+ "true",
53
+ "false",
54
+ "null",
55
+ "abstract",
56
+ "boolean",
57
+ "byte",
58
+ "char",
59
+ "const",
60
+ "double",
61
+ "final",
62
+ "float",
63
+ "goto",
64
+ "int",
65
+ "long",
66
+ "native",
67
+ "short",
68
+ "synchronized",
69
+ "throws",
70
+ "transient",
71
+ "volatile"
72
+ ];
73
+
74
+ module.exports = function(context) {
75
+ var options = context.options[0] || {};
76
+ var allowKeywords = options.allowKeywords === void 0 || !!options.allowKeywords;
77
+
78
+ var allowPattern;
79
+ if (options.allowPattern) {
80
+ allowPattern = new RegExp(options.allowPattern);
81
+ }
82
+
83
+ return {
84
+ "MemberExpression": function(node) {
85
+ if (
86
+ node.computed &&
87
+ node.property.type === "Literal" &&
88
+ validIdentifier.test(node.property.value) &&
89
+ (allowKeywords || keywords.indexOf("" + node.property.value) === -1)
90
+ ) {
91
+ if (!(allowPattern && allowPattern.test(node.property.value))) {
92
+ context.report(node, "[" + JSON.stringify(node.property.value) + "] is better written in dot notation.");
93
+ }
94
+ }
95
+ if (
96
+ !allowKeywords &&
97
+ !node.computed &&
98
+ keywords.indexOf("" + node.property.name) !== -1
99
+ ) {
100
+ context.report(node, "." + node.property.name + " is a syntax error.");
101
+ }
102
+ }
103
+ };
104
+ };
105
+
106
+ module.exports.schema = [
107
+ {
108
+ "type": "object",
109
+ "properties": {
110
+ "allowKeywords": {
111
+ "type": "boolean"
112
+ },
113
+ "allowPattern": {
114
+ "type": "string"
115
+ }
116
+ },
117
+ "additionalProperties": false
118
+ }
119
+ ];
@@ -1,38 +1,38 @@
1
- /**
2
- * @fileoverview Require file to end with single newline.
3
- * @author Nodeca Team <https://github.com/nodeca>
4
- */
5
- "use strict";
6
-
7
- //------------------------------------------------------------------------------
8
- // Rule Definition
9
- //------------------------------------------------------------------------------
10
-
11
- module.exports = function(context) {
12
-
13
- //--------------------------------------------------------------------------
14
- // Public
15
- //--------------------------------------------------------------------------
16
-
17
- return {
18
-
19
- "Program": function checkBadEOF(node) {
20
- // Get the whole source code, not for node only.
21
- var src = context.getSource(), location = {column: 1};
22
-
23
- if (src.length === 0) {
24
- return;
25
- }
26
-
27
- if (src[src.length - 1] !== "\n") {
28
- // file is not newline-terminated
29
- location.line = src.split(/\n/g).length;
30
- context.report(node, location, "Newline required at end of file but not found.");
31
- }
32
- }
33
-
34
- };
35
-
36
- };
37
-
38
- module.exports.schema = [];
1
+ /**
2
+ * @fileoverview Require file to end with single newline.
3
+ * @author Nodeca Team <https://github.com/nodeca>
4
+ */
5
+ "use strict";
6
+
7
+ //------------------------------------------------------------------------------
8
+ // Rule Definition
9
+ //------------------------------------------------------------------------------
10
+
11
+ module.exports = function(context) {
12
+
13
+ //--------------------------------------------------------------------------
14
+ // Public
15
+ //--------------------------------------------------------------------------
16
+
17
+ return {
18
+
19
+ "Program": function checkBadEOF(node) {
20
+ // Get the whole source code, not for node only.
21
+ var src = context.getSource(), location = {column: 1};
22
+
23
+ if (src.length === 0) {
24
+ return;
25
+ }
26
+
27
+ if (src[src.length - 1] !== "\n") {
28
+ // file is not newline-terminated
29
+ location.line = src.split(/\n/g).length;
30
+ context.report(node, location, "Newline required at end of file but not found.");
31
+ }
32
+ }
33
+
34
+ };
35
+
36
+ };
37
+
38
+ module.exports.schema = [];
@@ -1,96 +1,96 @@
1
- /**
2
- * @fileoverview Rule to flag statements that use != and == instead of !== and ===
3
- * @author Nicholas C. Zakas
4
- */
5
-
6
- "use strict";
7
-
8
- //------------------------------------------------------------------------------
9
- // Rule Definition
10
- //------------------------------------------------------------------------------
11
-
12
- module.exports = function(context) {
13
-
14
- /**
15
- * Checks if an expression is a typeof expression
16
- * @param {ASTNode} node The node to check
17
- * @returns {boolean} if the node is a typeof expression
18
- */
19
- function isTypeOf(node) {
20
- return node.type === "UnaryExpression" && node.operator === "typeof";
21
- }
22
-
23
- /**
24
- * Checks if either operand of a binary expression is a typeof operation
25
- * @param {ASTNode} node The node to check
26
- * @returns {boolean} if one of the operands is typeof
27
- * @private
28
- */
29
- function isTypeOfBinary(node) {
30
- return isTypeOf(node.left) || isTypeOf(node.right);
31
- }
32
-
33
- /**
34
- * Checks if operands are literals of the same type (via typeof)
35
- * @param {ASTNode} node The node to check
36
- * @returns {boolean} if operands are of same type
37
- * @private
38
- */
39
- function areLiteralsAndSameType(node) {
40
- return node.left.type === "Literal" && node.right.type === "Literal" &&
41
- typeof node.left.value === typeof node.right.value;
42
- }
43
-
44
- /**
45
- * Checks if one of the operands is a literal null
46
- * @param {ASTNode} node The node to check
47
- * @returns {boolean} if operands are null
48
- * @private
49
- */
50
- function isNullCheck(node) {
51
- return (node.right.type === "Literal" && node.right.value === null) ||
52
- (node.left.type === "Literal" && node.left.value === null);
53
- }
54
-
55
- /**
56
- * Gets the location (line and column) of the binary expression's operator
57
- * @param {ASTNode} node The binary expression node to check
58
- * @param {String} operator The operator to find
59
- * @returns {Object} { line, column } location of operator
60
- * @private
61
- */
62
- function getOperatorLocation(node) {
63
- var opToken = context.getTokenAfter(node.left);
64
- return {line: opToken.loc.start.line, column: opToken.loc.start.column};
65
- }
66
-
67
- return {
68
- "BinaryExpression": function(node) {
69
- if (node.operator !== "==" && node.operator !== "!=") {
70
- return;
71
- }
72
-
73
- if (context.options[0] === "smart" && (isTypeOfBinary(node) ||
74
- areLiteralsAndSameType(node)) || isNullCheck(node)) {
75
- return;
76
- }
77
-
78
- if (context.options[0] === "allow-null" && isNullCheck(node)) {
79
- return;
80
- }
81
-
82
- context.report(
83
- node, getOperatorLocation(node),
84
- "Expected '{{op}}=' and instead saw '{{op}}'.",
85
- {op: node.operator}
86
- );
87
- }
88
- };
89
-
90
- };
91
-
92
- module.exports.schema = [
93
- {
94
- "enum": ["smart", "allow-null"]
95
- }
96
- ];
1
+ /**
2
+ * @fileoverview Rule to flag statements that use != and == instead of !== and ===
3
+ * @author Nicholas C. Zakas
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //------------------------------------------------------------------------------
9
+ // Rule Definition
10
+ //------------------------------------------------------------------------------
11
+
12
+ module.exports = function(context) {
13
+
14
+ /**
15
+ * Checks if an expression is a typeof expression
16
+ * @param {ASTNode} node The node to check
17
+ * @returns {boolean} if the node is a typeof expression
18
+ */
19
+ function isTypeOf(node) {
20
+ return node.type === "UnaryExpression" && node.operator === "typeof";
21
+ }
22
+
23
+ /**
24
+ * Checks if either operand of a binary expression is a typeof operation
25
+ * @param {ASTNode} node The node to check
26
+ * @returns {boolean} if one of the operands is typeof
27
+ * @private
28
+ */
29
+ function isTypeOfBinary(node) {
30
+ return isTypeOf(node.left) || isTypeOf(node.right);
31
+ }
32
+
33
+ /**
34
+ * Checks if operands are literals of the same type (via typeof)
35
+ * @param {ASTNode} node The node to check
36
+ * @returns {boolean} if operands are of same type
37
+ * @private
38
+ */
39
+ function areLiteralsAndSameType(node) {
40
+ return node.left.type === "Literal" && node.right.type === "Literal" &&
41
+ typeof node.left.value === typeof node.right.value;
42
+ }
43
+
44
+ /**
45
+ * Checks if one of the operands is a literal null
46
+ * @param {ASTNode} node The node to check
47
+ * @returns {boolean} if operands are null
48
+ * @private
49
+ */
50
+ function isNullCheck(node) {
51
+ return (node.right.type === "Literal" && node.right.value === null) ||
52
+ (node.left.type === "Literal" && node.left.value === null);
53
+ }
54
+
55
+ /**
56
+ * Gets the location (line and column) of the binary expression's operator
57
+ * @param {ASTNode} node The binary expression node to check
58
+ * @param {String} operator The operator to find
59
+ * @returns {Object} { line, column } location of operator
60
+ * @private
61
+ */
62
+ function getOperatorLocation(node) {
63
+ var opToken = context.getTokenAfter(node.left);
64
+ return {line: opToken.loc.start.line, column: opToken.loc.start.column};
65
+ }
66
+
67
+ return {
68
+ "BinaryExpression": function(node) {
69
+ if (node.operator !== "==" && node.operator !== "!=") {
70
+ return;
71
+ }
72
+
73
+ if (context.options[0] === "smart" && (isTypeOfBinary(node) ||
74
+ areLiteralsAndSameType(node)) || isNullCheck(node)) {
75
+ return;
76
+ }
77
+
78
+ if (context.options[0] === "allow-null" && isNullCheck(node)) {
79
+ return;
80
+ }
81
+
82
+ context.report(
83
+ node, getOperatorLocation(node),
84
+ "Expected '{{op}}=' and instead saw '{{op}}'.",
85
+ {op: node.operator}
86
+ );
87
+ }
88
+ };
89
+
90
+ };
91
+
92
+ module.exports.schema = [
93
+ {
94
+ "enum": ["smart", "allow-null"]
95
+ }
96
+ ];
@@ -1,45 +1,45 @@
1
- /**
2
- * @fileoverview Rule to warn when a function expression does not have a name.
3
- * @author Kyle T. Nunery
4
- * @copyright 2015 Brandon Mills. All rights reserved.
5
- * @copyright 2014 Kyle T. Nunery. All rights reserved.
6
- */
7
-
8
- "use strict";
9
-
10
- //------------------------------------------------------------------------------
11
- // Rule Definition
12
- //------------------------------------------------------------------------------
13
-
14
- module.exports = function(context) {
15
-
16
- /**
17
- * Determines whether the current FunctionExpression node is a get, set, or
18
- * shorthand method in an object literal or a class.
19
- * @returns {boolean} True if the node is a get, set, or shorthand method.
20
- */
21
- function isObjectOrClassMethod() {
22
- var parent = context.getAncestors().pop();
23
-
24
- return (parent.type === "MethodDefinition" || (
25
- parent.type === "Property" && (
26
- parent.method ||
27
- parent.kind === "get" ||
28
- parent.kind === "set"
29
- )
30
- ));
31
- }
32
-
33
- return {
34
- "FunctionExpression": function(node) {
35
-
36
- var name = node.id && node.id.name;
37
-
38
- if (!name && !isObjectOrClassMethod()) {
39
- context.report(node, "Missing function expression name.");
40
- }
41
- }
42
- };
43
- };
44
-
45
- module.exports.schema = [];
1
+ /**
2
+ * @fileoverview Rule to warn when a function expression does not have a name.
3
+ * @author Kyle T. Nunery
4
+ * @copyright 2015 Brandon Mills. All rights reserved.
5
+ * @copyright 2014 Kyle T. Nunery. All rights reserved.
6
+ */
7
+
8
+ "use strict";
9
+
10
+ //------------------------------------------------------------------------------
11
+ // Rule Definition
12
+ //------------------------------------------------------------------------------
13
+
14
+ module.exports = function(context) {
15
+
16
+ /**
17
+ * Determines whether the current FunctionExpression node is a get, set, or
18
+ * shorthand method in an object literal or a class.
19
+ * @returns {boolean} True if the node is a get, set, or shorthand method.
20
+ */
21
+ function isObjectOrClassMethod() {
22
+ var parent = context.getAncestors().pop();
23
+
24
+ return (parent.type === "MethodDefinition" || (
25
+ parent.type === "Property" && (
26
+ parent.method ||
27
+ parent.kind === "get" ||
28
+ parent.kind === "set"
29
+ )
30
+ ));
31
+ }
32
+
33
+ return {
34
+ "FunctionExpression": function(node) {
35
+
36
+ var name = node.id && node.id.name;
37
+
38
+ if (!name && !isObjectOrClassMethod()) {
39
+ context.report(node, "Missing function expression name.");
40
+ }
41
+ }
42
+ };
43
+ };
44
+
45
+ module.exports.schema = [];