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,109 +1,109 @@
1
- /**
2
- * @fileoverview Rule to flag statements without curly braces
3
- * @author Nicholas C. Zakas
4
- */
5
- "use strict";
6
-
7
- //------------------------------------------------------------------------------
8
- // Rule Definition
9
- //------------------------------------------------------------------------------
10
-
11
- module.exports = function(context) {
12
-
13
- var multiOnly = (context.options[0] === "multi");
14
- var multiLine = (context.options[0] === "multi-line");
15
-
16
- //--------------------------------------------------------------------------
17
- // Helpers
18
- //--------------------------------------------------------------------------
19
-
20
- /**
21
- * Determines if a given node is a one-liner that's on the same line as it's preceding code.
22
- * @param {ASTNode} node The node to check.
23
- * @returns {boolean} True if the node is a one-liner that's on the same line as it's preceding code.
24
- * @private
25
- */
26
- function isCollapsedOneLiner(node) {
27
- var before = context.getTokenBefore(node),
28
- last = context.getLastToken(node);
29
- return before.loc.start.line === last.loc.end.line;
30
- }
31
-
32
- /**
33
- * Checks the body of a node to see if it's a block statement. Depending on
34
- * the rule options, reports the appropriate problems.
35
- * @param {ASTNode} node The node to report if there's a problem.
36
- * @param {ASTNode} body The body node to check for blocks.
37
- * @param {string} name The name to report if there's a problem.
38
- * @param {string} suffix Additional string to add to the end of a report.
39
- * @returns {void}
40
- */
41
- function checkBody(node, body, name, suffix) {
42
- var hasBlock = (body.type === "BlockStatement");
43
-
44
- if (multiOnly) {
45
- if (hasBlock && body.body.length === 1) {
46
- context.report(node, "Unnecessary { after '{{name}}'{{suffix}}.",
47
- {
48
- name: name,
49
- suffix: (suffix ? " " + suffix : "")
50
- }
51
- );
52
- }
53
- } else if (multiLine) {
54
- if (!hasBlock && !isCollapsedOneLiner(body)) {
55
- context.report(node, "Expected { after '{{name}}'{{suffix}}.",
56
- {
57
- name: name,
58
- suffix: (suffix ? " " + suffix : "")
59
- }
60
- );
61
- }
62
- } else {
63
- if (!hasBlock) {
64
- context.report(node, "Expected { after '{{name}}'{{suffix}}.",
65
- {
66
- name: name,
67
- suffix: (suffix ? " " + suffix : "")
68
- }
69
- );
70
- }
71
- }
72
- }
73
-
74
- //--------------------------------------------------------------------------
75
- // Public
76
- //--------------------------------------------------------------------------
77
-
78
- return {
79
-
80
- "IfStatement": function(node) {
81
-
82
- checkBody(node, node.consequent, "if", "condition");
83
-
84
- if (node.alternate && node.alternate.type !== "IfStatement") {
85
- checkBody(node, node.alternate, "else");
86
- }
87
-
88
- },
89
-
90
- "WhileStatement": function(node) {
91
- checkBody(node, node.body, "while", "condition");
92
- },
93
-
94
- "DoWhileStatement": function (node) {
95
- checkBody(node, node.body, "do");
96
- },
97
-
98
- "ForStatement": function(node) {
99
- checkBody(node, node.body, "for", "condition");
100
- }
101
- };
102
-
103
- };
104
-
105
- module.exports.schema = [
106
- {
107
- "enum": ["all", "multi", "multi-line"]
108
- }
109
- ];
1
+ /**
2
+ * @fileoverview Rule to flag statements without curly braces
3
+ * @author Nicholas C. Zakas
4
+ */
5
+ "use strict";
6
+
7
+ //------------------------------------------------------------------------------
8
+ // Rule Definition
9
+ //------------------------------------------------------------------------------
10
+
11
+ module.exports = function(context) {
12
+
13
+ var multiOnly = (context.options[0] === "multi");
14
+ var multiLine = (context.options[0] === "multi-line");
15
+
16
+ //--------------------------------------------------------------------------
17
+ // Helpers
18
+ //--------------------------------------------------------------------------
19
+
20
+ /**
21
+ * Determines if a given node is a one-liner that's on the same line as it's preceding code.
22
+ * @param {ASTNode} node The node to check.
23
+ * @returns {boolean} True if the node is a one-liner that's on the same line as it's preceding code.
24
+ * @private
25
+ */
26
+ function isCollapsedOneLiner(node) {
27
+ var before = context.getTokenBefore(node),
28
+ last = context.getLastToken(node);
29
+ return before.loc.start.line === last.loc.end.line;
30
+ }
31
+
32
+ /**
33
+ * Checks the body of a node to see if it's a block statement. Depending on
34
+ * the rule options, reports the appropriate problems.
35
+ * @param {ASTNode} node The node to report if there's a problem.
36
+ * @param {ASTNode} body The body node to check for blocks.
37
+ * @param {string} name The name to report if there's a problem.
38
+ * @param {string} suffix Additional string to add to the end of a report.
39
+ * @returns {void}
40
+ */
41
+ function checkBody(node, body, name, suffix) {
42
+ var hasBlock = (body.type === "BlockStatement");
43
+
44
+ if (multiOnly) {
45
+ if (hasBlock && body.body.length === 1) {
46
+ context.report(node, "Unnecessary { after '{{name}}'{{suffix}}.",
47
+ {
48
+ name: name,
49
+ suffix: (suffix ? " " + suffix : "")
50
+ }
51
+ );
52
+ }
53
+ } else if (multiLine) {
54
+ if (!hasBlock && !isCollapsedOneLiner(body)) {
55
+ context.report(node, "Expected { after '{{name}}'{{suffix}}.",
56
+ {
57
+ name: name,
58
+ suffix: (suffix ? " " + suffix : "")
59
+ }
60
+ );
61
+ }
62
+ } else {
63
+ if (!hasBlock) {
64
+ context.report(node, "Expected { after '{{name}}'{{suffix}}.",
65
+ {
66
+ name: name,
67
+ suffix: (suffix ? " " + suffix : "")
68
+ }
69
+ );
70
+ }
71
+ }
72
+ }
73
+
74
+ //--------------------------------------------------------------------------
75
+ // Public
76
+ //--------------------------------------------------------------------------
77
+
78
+ return {
79
+
80
+ "IfStatement": function(node) {
81
+
82
+ checkBody(node, node.consequent, "if", "condition");
83
+
84
+ if (node.alternate && node.alternate.type !== "IfStatement") {
85
+ checkBody(node, node.alternate, "else");
86
+ }
87
+
88
+ },
89
+
90
+ "WhileStatement": function(node) {
91
+ checkBody(node, node.body, "while", "condition");
92
+ },
93
+
94
+ "DoWhileStatement": function (node) {
95
+ checkBody(node, node.body, "do");
96
+ },
97
+
98
+ "ForStatement": function(node) {
99
+ checkBody(node, node.body, "for", "condition");
100
+ }
101
+ };
102
+
103
+ };
104
+
105
+ module.exports.schema = [
106
+ {
107
+ "enum": ["all", "multi", "multi-line"]
108
+ }
109
+ ];
@@ -1,66 +1,66 @@
1
- /**
2
- * @fileoverview require default case in switch statements
3
- * @author Aliaksei Shytkin
4
- */
5
- "use strict";
6
-
7
- var COMMENT_VALUE = "no default";
8
-
9
- //------------------------------------------------------------------------------
10
- // Rule Definition
11
- //------------------------------------------------------------------------------
12
-
13
- module.exports = function(context) {
14
-
15
- //--------------------------------------------------------------------------
16
- // Helpers
17
- //--------------------------------------------------------------------------
18
-
19
- /**
20
- * Shortcut to get last element of array
21
- * @param {*[]} collection Array
22
- * @returns {*} Last element
23
- */
24
- function last(collection) {
25
- return collection[collection.length - 1];
26
- }
27
-
28
- //--------------------------------------------------------------------------
29
- // Public
30
- //--------------------------------------------------------------------------
31
-
32
- return {
33
-
34
- "SwitchStatement": function(node) {
35
-
36
- if (!node.cases.length) {
37
- // skip check of empty switch because there is no easy way
38
- // to extract comments inside it now
39
- return;
40
- }
41
-
42
- var hasDefault = node.cases.some(function(v) {
43
- return v.test === null;
44
- });
45
-
46
- if (!hasDefault) {
47
-
48
- var comment;
49
- var comments;
50
-
51
- var lastCase = last(node.cases);
52
- comments = context.getComments(lastCase).trailing;
53
-
54
- if (comments.length) {
55
- comment = last(comments);
56
- }
57
-
58
- if (!comment || comment.value.trim() !== COMMENT_VALUE) {
59
- context.report(node, "Expected a default case.");
60
- }
61
- }
62
- }
63
- };
64
- };
65
-
66
- module.exports.schema = [];
1
+ /**
2
+ * @fileoverview require default case in switch statements
3
+ * @author Aliaksei Shytkin
4
+ */
5
+ "use strict";
6
+
7
+ var COMMENT_VALUE = "no default";
8
+
9
+ //------------------------------------------------------------------------------
10
+ // Rule Definition
11
+ //------------------------------------------------------------------------------
12
+
13
+ module.exports = function(context) {
14
+
15
+ //--------------------------------------------------------------------------
16
+ // Helpers
17
+ //--------------------------------------------------------------------------
18
+
19
+ /**
20
+ * Shortcut to get last element of array
21
+ * @param {*[]} collection Array
22
+ * @returns {*} Last element
23
+ */
24
+ function last(collection) {
25
+ return collection[collection.length - 1];
26
+ }
27
+
28
+ //--------------------------------------------------------------------------
29
+ // Public
30
+ //--------------------------------------------------------------------------
31
+
32
+ return {
33
+
34
+ "SwitchStatement": function(node) {
35
+
36
+ if (!node.cases.length) {
37
+ // skip check of empty switch because there is no easy way
38
+ // to extract comments inside it now
39
+ return;
40
+ }
41
+
42
+ var hasDefault = node.cases.some(function(v) {
43
+ return v.test === null;
44
+ });
45
+
46
+ if (!hasDefault) {
47
+
48
+ var comment;
49
+ var comments;
50
+
51
+ var lastCase = last(node.cases);
52
+ comments = context.getComments(lastCase).trailing;
53
+
54
+ if (comments.length) {
55
+ comment = last(comments);
56
+ }
57
+
58
+ if (!comment || comment.value.trim() !== COMMENT_VALUE) {
59
+ context.report(node, "Expected a default case.");
60
+ }
61
+ }
62
+ }
63
+ };
64
+ };
65
+
66
+ module.exports.schema = [];
@@ -1,63 +1,63 @@
1
- /**
2
- * @fileoverview Validates newlines before and after dots
3
- * @author Greg Cochard
4
- * @copyright 2015 Greg Cochard
5
- */
6
-
7
- "use strict";
8
-
9
- //------------------------------------------------------------------------------
10
- // Rule Definition
11
- //------------------------------------------------------------------------------
12
-
13
- module.exports = function (context) {
14
-
15
- var config = context.options[0],
16
- // default to onObject if no preference is passed
17
- onObject = config === "object" || !config;
18
-
19
- /**
20
- * Checks whether two tokens are on the same line.
21
- * @param {Object} left The leftmost token.
22
- * @param {Object} right The rightmost token.
23
- * @returns {boolean} True if the tokens are on the same line, false if not.
24
- * @private
25
- */
26
- function isSameLine(left, right) {
27
- return left.loc.end.line === right.loc.start.line;
28
- }
29
-
30
- /**
31
- * Reports if the dot between object and property is on the correct loccation.
32
- * @param {ASTNode} obj The object owning the property.
33
- * @param {ASTNode} prop The property of the object.
34
- * @param {ASTNode} node The corresponding node of the token.
35
- * @returns {void}
36
- */
37
- function checkDotLocation(obj, prop, node) {
38
- var dot = context.getTokenBefore(prop);
39
-
40
- if (dot.type === "Punctuator" && dot.value === ".") {
41
- if (onObject) {
42
- if (!isSameLine(obj, dot)) {
43
- context.report(node, dot.loc.start, "Expected dot to be on same line as object.");
44
- }
45
- } else if (!isSameLine(dot, prop)) {
46
- context.report(node, dot.loc.start, "Expected dot to be on same line as property.");
47
- }
48
- }
49
- }
50
-
51
- /**
52
- * Checks the spacing of the dot within a member expression.
53
- * @param {ASTNode} node The node to check.
54
- * @returns {void}
55
- */
56
- function checkNode(node) {
57
- checkDotLocation(node.object, node.property, node);
58
- }
59
-
60
- return {
61
- "MemberExpression": checkNode
62
- };
63
- };
1
+ /**
2
+ * @fileoverview Validates newlines before and after dots
3
+ * @author Greg Cochard
4
+ * @copyright 2015 Greg Cochard
5
+ */
6
+
7
+ "use strict";
8
+
9
+ //------------------------------------------------------------------------------
10
+ // Rule Definition
11
+ //------------------------------------------------------------------------------
12
+
13
+ module.exports = function (context) {
14
+
15
+ var config = context.options[0],
16
+ // default to onObject if no preference is passed
17
+ onObject = config === "object" || !config;
18
+
19
+ /**
20
+ * Checks whether two tokens are on the same line.
21
+ * @param {Object} left The leftmost token.
22
+ * @param {Object} right The rightmost token.
23
+ * @returns {boolean} True if the tokens are on the same line, false if not.
24
+ * @private
25
+ */
26
+ function isSameLine(left, right) {
27
+ return left.loc.end.line === right.loc.start.line;
28
+ }
29
+
30
+ /**
31
+ * Reports if the dot between object and property is on the correct loccation.
32
+ * @param {ASTNode} obj The object owning the property.
33
+ * @param {ASTNode} prop The property of the object.
34
+ * @param {ASTNode} node The corresponding node of the token.
35
+ * @returns {void}
36
+ */
37
+ function checkDotLocation(obj, prop, node) {
38
+ var dot = context.getTokenBefore(prop);
39
+
40
+ if (dot.type === "Punctuator" && dot.value === ".") {
41
+ if (onObject) {
42
+ if (!isSameLine(obj, dot)) {
43
+ context.report(node, dot.loc.start, "Expected dot to be on same line as object.");
44
+ }
45
+ } else if (!isSameLine(dot, prop)) {
46
+ context.report(node, dot.loc.start, "Expected dot to be on same line as property.");
47
+ }
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Checks the spacing of the dot within a member expression.
53
+ * @param {ASTNode} node The node to check.
54
+ * @returns {void}
55
+ */
56
+ function checkNode(node) {
57
+ checkDotLocation(node.object, node.property, node);
58
+ }
59
+
60
+ return {
61
+ "MemberExpression": checkNode
62
+ };
63
+ };