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.
- package/LICENSE +20 -20
- package/README.md +111 -95
- package/bin/eslint.js +41 -41
- package/conf/environments.js +87 -81
- package/conf/eslint.json +186 -179
- package/lib/api.js +13 -12
- package/lib/cli-engine.js +441 -451
- package/lib/cli.js +196 -196
- package/lib/config-initializer.js +145 -145
- package/lib/config-validator.js +110 -110
- package/lib/config.js +428 -416
- package/lib/eslint.js +1072 -1073
- package/lib/file-finder.js +167 -167
- package/lib/formatters/checkstyle.js +68 -68
- package/lib/formatters/compact.js +53 -53
- package/lib/formatters/jslint-xml.js +40 -40
- package/lib/formatters/junit.js +63 -63
- package/lib/formatters/stylish.js +90 -90
- package/lib/formatters/tap.js +86 -86
- package/lib/ignored-paths.js +137 -137
- package/lib/load-rules.js +39 -39
- package/lib/options.js +132 -126
- package/lib/rule-context.js +107 -107
- package/lib/rules/accessor-pairs.js +65 -65
- package/lib/rules/array-bracket-spacing.js +180 -0
- package/lib/rules/block-scoped-var.js +339 -320
- package/lib/rules/brace-style.js +228 -228
- package/lib/rules/camelcase.js +111 -111
- package/lib/rules/comma-dangle.js +67 -64
- package/lib/rules/comma-spacing.js +191 -191
- package/lib/rules/comma-style.js +195 -195
- package/lib/rules/complexity.js +94 -94
- package/lib/rules/computed-property-spacing.js +144 -0
- package/lib/rules/consistent-return.js +75 -75
- package/lib/rules/consistent-this.js +119 -119
- package/lib/rules/constructor-super.js +108 -0
- package/lib/rules/curly.js +109 -109
- package/lib/rules/default-case.js +66 -66
- package/lib/rules/dot-location.js +63 -63
- package/lib/rules/dot-notation.js +119 -119
- package/lib/rules/eol-last.js +38 -38
- package/lib/rules/eqeqeq.js +96 -96
- package/lib/rules/func-names.js +45 -45
- package/lib/rules/func-style.js +49 -49
- package/lib/rules/generator-star-spacing.js +104 -87
- package/lib/rules/generator-star.js +76 -76
- package/lib/rules/global-strict.js +49 -49
- package/lib/rules/guard-for-in.js +32 -32
- package/lib/rules/handle-callback-err.js +81 -124
- package/lib/rules/indent.js +486 -486
- package/lib/rules/key-spacing.js +325 -325
- package/lib/rules/linebreak-style.js +44 -44
- package/lib/rules/lines-around-comment.js +228 -160
- package/lib/rules/max-depth.js +89 -89
- package/lib/rules/max-len.js +76 -76
- package/lib/rules/max-nested-callbacks.js +73 -73
- package/lib/rules/max-params.js +45 -45
- package/lib/rules/max-statements.js +61 -61
- package/lib/rules/new-cap.js +224 -224
- package/lib/rules/new-parens.js +29 -29
- package/lib/rules/newline-after-var.js +127 -127
- package/lib/rules/no-alert.js +153 -153
- package/lib/rules/no-array-constructor.js +31 -31
- package/lib/rules/no-bitwise.js +57 -57
- package/lib/rules/no-caller.js +29 -29
- package/lib/rules/no-catch-shadow.js +52 -52
- package/lib/rules/no-comma-dangle.js +45 -45
- package/lib/rules/no-cond-assign.js +123 -123
- package/lib/rules/no-console.js +27 -27
- package/lib/rules/no-constant-condition.js +73 -73
- package/lib/rules/no-continue.js +23 -23
- package/lib/rules/no-control-regex.js +58 -58
- package/lib/rules/no-debugger.js +22 -22
- package/lib/rules/no-delete-var.js +25 -25
- package/lib/rules/no-div-regex.js +27 -27
- package/lib/rules/no-dupe-args.js +89 -85
- package/lib/rules/no-dupe-keys.js +43 -43
- package/lib/rules/no-duplicate-case.js +67 -67
- package/lib/rules/no-else-return.js +125 -125
- package/lib/rules/no-empty-character-class.js +43 -43
- package/lib/rules/no-empty-class.js +45 -45
- package/lib/rules/no-empty-label.js +27 -27
- package/lib/rules/no-empty.js +49 -49
- package/lib/rules/no-eq-null.js +29 -29
- package/lib/rules/no-eval.js +26 -26
- package/lib/rules/no-ex-assign.js +42 -42
- package/lib/rules/no-extend-native.js +103 -103
- package/lib/rules/no-extra-bind.js +81 -81
- package/lib/rules/no-extra-boolean-cast.js +71 -71
- package/lib/rules/no-extra-parens.js +368 -355
- package/lib/rules/no-extra-semi.js +70 -23
- package/lib/rules/no-extra-strict.js +86 -86
- package/lib/rules/no-fallthrough.js +97 -97
- package/lib/rules/no-floating-decimal.js +30 -30
- package/lib/rules/no-func-assign.js +83 -83
- package/lib/rules/no-implied-eval.js +76 -76
- package/lib/rules/no-inline-comments.js +49 -49
- package/lib/rules/no-inner-declarations.js +78 -78
- package/lib/rules/no-invalid-regexp.js +53 -53
- package/lib/rules/no-irregular-whitespace.js +135 -135
- package/lib/rules/no-iterator.js +28 -28
- package/lib/rules/no-label-var.js +64 -64
- package/lib/rules/no-labels.js +44 -44
- package/lib/rules/no-lone-blocks.js +106 -27
- package/lib/rules/no-lonely-if.js +30 -30
- package/lib/rules/no-loop-func.js +58 -58
- package/lib/rules/no-mixed-requires.js +165 -165
- package/lib/rules/no-mixed-spaces-and-tabs.js +74 -74
- package/lib/rules/no-multi-spaces.js +119 -119
- package/lib/rules/no-multi-str.js +43 -43
- package/lib/rules/no-multiple-empty-lines.js +98 -98
- package/lib/rules/no-native-reassign.js +62 -62
- package/lib/rules/no-negated-in-lhs.js +25 -25
- package/lib/rules/no-nested-ternary.js +24 -24
- package/lib/rules/no-new-func.js +25 -25
- package/lib/rules/no-new-object.js +25 -25
- package/lib/rules/no-new-require.js +25 -25
- package/lib/rules/no-new-wrappers.js +26 -26
- package/lib/rules/no-new.js +27 -27
- package/lib/rules/no-obj-calls.js +28 -28
- package/lib/rules/no-octal-escape.js +39 -39
- package/lib/rules/no-octal.js +25 -25
- package/lib/rules/no-param-reassign.js +87 -87
- package/lib/rules/no-path-concat.js +39 -39
- package/lib/rules/no-plusplus.js +24 -24
- package/lib/rules/no-process-env.js +30 -30
- package/lib/rules/no-process-exit.js +33 -33
- package/lib/rules/no-proto.js +28 -28
- package/lib/rules/no-redeclare.js +68 -68
- package/lib/rules/no-regex-spaces.js +35 -35
- package/lib/rules/no-reserved-keys.js +56 -56
- package/lib/rules/no-restricted-modules.js +85 -85
- package/lib/rules/no-return-assign.js +53 -24
- package/lib/rules/no-script-url.js +34 -34
- package/lib/rules/no-self-compare.js +29 -29
- package/lib/rules/no-sequences.js +94 -94
- package/lib/rules/no-shadow-restricted-names.js +51 -51
- package/lib/rules/no-shadow.js +181 -136
- package/lib/rules/no-space-before-semi.js +98 -98
- package/lib/rules/no-spaced-func.js +37 -37
- package/lib/rules/no-sparse-arrays.js +33 -33
- package/lib/rules/no-sync.js +30 -30
- package/lib/rules/no-ternary.js +24 -24
- package/lib/rules/no-this-before-super.js +144 -0
- package/lib/rules/no-throw-literal.js +33 -33
- package/lib/rules/no-trailing-spaces.js +74 -63
- package/lib/rules/no-undef-init.js +28 -28
- package/lib/rules/no-undef.js +92 -92
- package/lib/rules/no-undefined.js +27 -27
- package/lib/rules/no-underscore-dangle.js +73 -73
- package/lib/rules/no-unexpected-multiline.js +58 -0
- package/lib/rules/no-unneeded-ternary.js +48 -48
- package/lib/rules/no-unreachable.js +98 -98
- package/lib/rules/no-unused-expressions.js +76 -76
- package/lib/rules/no-unused-vars.js +252 -250
- package/lib/rules/no-use-before-define.js +105 -105
- package/lib/rules/no-var.js +26 -26
- package/lib/rules/no-void.js +28 -28
- package/lib/rules/no-warning-comments.js +102 -102
- package/lib/rules/no-with.js +22 -22
- package/lib/rules/no-wrap-func.js +65 -65
- package/lib/rules/object-curly-spacing.js +231 -206
- package/lib/rules/object-shorthand.js +74 -73
- package/lib/rules/one-var.js +311 -304
- package/lib/rules/operator-assignment.js +118 -118
- package/lib/rules/operator-linebreak.js +114 -114
- package/lib/rules/padded-blocks.js +98 -98
- package/lib/rules/prefer-const.js +91 -0
- package/lib/rules/quote-props.js +72 -72
- package/lib/rules/quotes.js +92 -92
- package/lib/rules/radix.js +41 -41
- package/lib/rules/semi-spacing.js +167 -167
- package/lib/rules/semi.js +136 -136
- package/lib/rules/sort-vars.js +49 -49
- package/lib/rules/space-after-function-name.js +49 -49
- package/lib/rules/space-after-keywords.js +82 -82
- package/lib/rules/space-before-blocks.js +91 -91
- package/lib/rules/space-before-function-paren.js +139 -139
- package/lib/rules/space-before-function-parentheses.js +139 -139
- package/lib/rules/space-in-brackets.js +305 -305
- package/lib/rules/space-in-parens.js +281 -281
- package/lib/rules/space-infix-ops.js +106 -106
- package/lib/rules/space-return-throw-case.js +38 -38
- package/lib/rules/space-unary-ops.js +124 -133
- package/lib/rules/spaced-comment.js +143 -0
- package/lib/rules/spaced-line-comment.js +89 -89
- package/lib/rules/strict.js +242 -242
- package/lib/rules/use-isnan.js +26 -26
- package/lib/rules/valid-jsdoc.js +215 -215
- package/lib/rules/valid-typeof.js +42 -42
- package/lib/rules/vars-on-top.js +115 -115
- package/lib/rules/wrap-iife.js +48 -48
- package/lib/rules/wrap-regex.js +38 -38
- package/lib/rules/yoda.js +242 -225
- package/lib/rules.js +88 -88
- package/lib/timing.js +109 -109
- package/lib/token-store.js +201 -201
- package/lib/util/traverse.js +105 -105
- package/lib/util.js +125 -85
- package/package.json +6 -6
- package/CHANGELOG.md +0 -1638
@@ -1,44 +1,44 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to forbid mixing LF and LFCR line breaks.
|
3
|
-
* @author Erik Mueller
|
4
|
-
* @copyright 2015 Varun Verma. All rights reserverd.
|
5
|
-
* @copyright 2015 James Whitney. All rights reserved.
|
6
|
-
* @copyright 2015 Erik Mueller. All rights reserved.
|
7
|
-
*/
|
8
|
-
|
9
|
-
"use strict";
|
10
|
-
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
// Rule Definition
|
13
|
-
//------------------------------------------------------------------------------
|
14
|
-
|
15
|
-
module.exports = function (context) {
|
16
|
-
var EXPECTED_LF_MSG = "Expected linebreaks to be 'LF' but found 'CRLF'.",
|
17
|
-
EXPECTED_CRLF_MSG = "Expected linebreaks to be 'CRLF' but found 'LF'.";
|
18
|
-
|
19
|
-
return {
|
20
|
-
"Program": function checkForlinebreakStyle(node) {
|
21
|
-
var linebreakStyle = context.options[0] || "unix",
|
22
|
-
expectedLF = linebreakStyle === "unix",
|
23
|
-
linebreaks = context.getSource().match(/\r\n|\r|\n|\u2028|\u2029/g),
|
24
|
-
lineOfError = -1;
|
25
|
-
|
26
|
-
if (linebreaks !== null) {
|
27
|
-
lineOfError = linebreaks.indexOf(expectedLF ? "\r\n" : "\n");
|
28
|
-
}
|
29
|
-
|
30
|
-
if (lineOfError !== -1) {
|
31
|
-
context.report(node, {
|
32
|
-
line: lineOfError + 1,
|
33
|
-
column: context.getSourceLines()[lineOfError].length
|
34
|
-
}, expectedLF ? EXPECTED_LF_MSG : EXPECTED_CRLF_MSG);
|
35
|
-
}
|
36
|
-
}
|
37
|
-
};
|
38
|
-
};
|
39
|
-
|
40
|
-
module.exports.schema = [
|
41
|
-
{
|
42
|
-
"enum": ["unix", "windows"]
|
43
|
-
}
|
44
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to forbid mixing LF and LFCR line breaks.
|
3
|
+
* @author Erik Mueller
|
4
|
+
* @copyright 2015 Varun Verma. All rights reserverd.
|
5
|
+
* @copyright 2015 James Whitney. All rights reserved.
|
6
|
+
* @copyright 2015 Erik Mueller. All rights reserved.
|
7
|
+
*/
|
8
|
+
|
9
|
+
"use strict";
|
10
|
+
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
// Rule Definition
|
13
|
+
//------------------------------------------------------------------------------
|
14
|
+
|
15
|
+
module.exports = function (context) {
|
16
|
+
var EXPECTED_LF_MSG = "Expected linebreaks to be 'LF' but found 'CRLF'.",
|
17
|
+
EXPECTED_CRLF_MSG = "Expected linebreaks to be 'CRLF' but found 'LF'.";
|
18
|
+
|
19
|
+
return {
|
20
|
+
"Program": function checkForlinebreakStyle(node) {
|
21
|
+
var linebreakStyle = context.options[0] || "unix",
|
22
|
+
expectedLF = linebreakStyle === "unix",
|
23
|
+
linebreaks = context.getSource().match(/\r\n|\r|\n|\u2028|\u2029/g),
|
24
|
+
lineOfError = -1;
|
25
|
+
|
26
|
+
if (linebreaks !== null) {
|
27
|
+
lineOfError = linebreaks.indexOf(expectedLF ? "\r\n" : "\n");
|
28
|
+
}
|
29
|
+
|
30
|
+
if (lineOfError !== -1) {
|
31
|
+
context.report(node, {
|
32
|
+
line: lineOfError + 1,
|
33
|
+
column: context.getSourceLines()[lineOfError].length
|
34
|
+
}, expectedLF ? EXPECTED_LF_MSG : EXPECTED_CRLF_MSG);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
};
|
38
|
+
};
|
39
|
+
|
40
|
+
module.exports.schema = [
|
41
|
+
{
|
42
|
+
"enum": ["unix", "windows"]
|
43
|
+
}
|
44
|
+
];
|
@@ -1,160 +1,228 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Enforces empty lines around comments.
|
3
|
-
* @author Jamund Ferguson
|
4
|
-
* @copyright 2015
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
*
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
}).
|
22
|
-
return line.
|
23
|
-
})
|
24
|
-
|
25
|
-
}
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
*
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
}
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
*
|
46
|
-
* @
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
//------------------------------------------------------------------------------
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
options
|
61
|
-
options.
|
62
|
-
options.
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
var
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
*
|
92
|
-
* @
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
var
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
}
|
158
|
-
|
159
|
-
|
160
|
-
|
1
|
+
/**
|
2
|
+
* @fileoverview Enforces empty lines around comments.
|
3
|
+
* @author Jamund Ferguson
|
4
|
+
* @copyright 2015 Mathieu M-Gosselin. All rights reserved.
|
5
|
+
* @copyright 2015 Jamund Ferguson. All rights reserved.
|
6
|
+
* @copyright 2015 Gyandeep Singh. All rights reserved.
|
7
|
+
*/
|
8
|
+
"use strict";
|
9
|
+
|
10
|
+
/**
|
11
|
+
* Return an array with with any line numbers that are empty.
|
12
|
+
* @param {Array} lines An array of each line of the file.
|
13
|
+
* @returns {Array} An array of line numbers.
|
14
|
+
*/
|
15
|
+
function getEmptyLineNums(lines) {
|
16
|
+
var emptyLines = lines.map(function(line, i) {
|
17
|
+
return {
|
18
|
+
code: line.trim(),
|
19
|
+
num: i + 1
|
20
|
+
};
|
21
|
+
}).filter(function(line) {
|
22
|
+
return !line.code;
|
23
|
+
}).map(function(line) {
|
24
|
+
return line.num;
|
25
|
+
});
|
26
|
+
return emptyLines;
|
27
|
+
}
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Return an array with with any line numbers that contain comments.
|
31
|
+
* @param {Array} comments An array of comment nodes.
|
32
|
+
* @returns {Array} An array of line numbers.
|
33
|
+
*/
|
34
|
+
function getCommentLineNums(comments) {
|
35
|
+
var lines = [];
|
36
|
+
comments.forEach(function (token) {
|
37
|
+
var start = token.loc.start.line;
|
38
|
+
var end = token.loc.end.line;
|
39
|
+
lines.push(start, end);
|
40
|
+
});
|
41
|
+
return lines;
|
42
|
+
}
|
43
|
+
|
44
|
+
/**
|
45
|
+
* Determines if a value is an array.
|
46
|
+
* @param {number} val The value we wish to check for in the array..
|
47
|
+
* @param {Array} array An array.
|
48
|
+
* @returns {boolean} True if the value is in the array..
|
49
|
+
*/
|
50
|
+
function contains(val, array) {
|
51
|
+
return array.indexOf(val) > -1;
|
52
|
+
}
|
53
|
+
|
54
|
+
//------------------------------------------------------------------------------
|
55
|
+
// Rule Definition
|
56
|
+
//------------------------------------------------------------------------------
|
57
|
+
|
58
|
+
module.exports = function(context) {
|
59
|
+
|
60
|
+
var options = context.options[0] || {};
|
61
|
+
options.beforeLineComment = options.beforeLineComment || false;
|
62
|
+
options.afterLineComment = options.afterLineComment || false;
|
63
|
+
options.beforeBlockComment = typeof options.beforeBlockComment !== "undefined" ? options.beforeBlockComment : true;
|
64
|
+
options.afterBlockComment = options.afterBlockComment || false;
|
65
|
+
options.allowBlockStart = options.allowBlockStart || false;
|
66
|
+
options.allowBlockEnd = options.allowBlockEnd || false;
|
67
|
+
|
68
|
+
/**
|
69
|
+
* Returns whether or not comments are not on lines starting with or ending with code
|
70
|
+
* @param {ASTNode} node The comment node to check.
|
71
|
+
* @returns {boolean} True if the comment is not alone.
|
72
|
+
*/
|
73
|
+
function codeAroundComment(node) {
|
74
|
+
|
75
|
+
var lines = context.getSourceLines();
|
76
|
+
|
77
|
+
// Get the whole line and cut it off at the start of the comment
|
78
|
+
var startLine = lines[node.loc.start.line - 1];
|
79
|
+
var endLine = lines[node.loc.end.line - 1];
|
80
|
+
|
81
|
+
var preamble = startLine.slice(0, node.loc.start.column).trim();
|
82
|
+
|
83
|
+
// Also check after the comment
|
84
|
+
var postamble = endLine.slice(node.loc.end.column).trim();
|
85
|
+
|
86
|
+
// Should be false if there was only whitespace around the comment
|
87
|
+
return !!(preamble || postamble);
|
88
|
+
}
|
89
|
+
|
90
|
+
/**
|
91
|
+
* Returns whether or not comments are at the block start or not.
|
92
|
+
* @param {ASTNode} node The Comment node.
|
93
|
+
* @returns {boolean} True if the comment is at block start.
|
94
|
+
*/
|
95
|
+
function isCommentAtBlockStart(node) {
|
96
|
+
var ancestors = context.getAncestors();
|
97
|
+
var parent;
|
98
|
+
|
99
|
+
if (ancestors.length) {
|
100
|
+
parent = ancestors.pop();
|
101
|
+
}
|
102
|
+
|
103
|
+
return parent && (parent.type === "ClassBody" || parent.type === "BlockStatement" || (parent.body && parent.body.type === "BlockStatement")) &&
|
104
|
+
node.loc.start.line - parent.loc.start.line === 1;
|
105
|
+
}
|
106
|
+
|
107
|
+
/**
|
108
|
+
* Returns whether or not comments are at the block end or not.
|
109
|
+
* @param {ASTNode} node The Comment node.
|
110
|
+
* @returns {boolean} True if the comment is at block end.
|
111
|
+
*/
|
112
|
+
function isCommentAtBlockEnd(node) {
|
113
|
+
var ancestors = context.getAncestors();
|
114
|
+
var parent;
|
115
|
+
|
116
|
+
if (ancestors.length) {
|
117
|
+
parent = ancestors.pop();
|
118
|
+
}
|
119
|
+
|
120
|
+
return parent && (parent.type === "ClassBody" || parent.type === "BlockStatement" || (parent.body && parent.body.type === "BlockStatement")) &&
|
121
|
+
parent.loc.end.line - node.loc.end.line === 1;
|
122
|
+
}
|
123
|
+
|
124
|
+
/**
|
125
|
+
* Checks if a comment node has lines around it (ignores inline comments)
|
126
|
+
* @param {ASTNode} node The Comment node.
|
127
|
+
* @param {Object} opts Options to determine the newline.
|
128
|
+
* @param {Boolean} opts.after Should have a newline after this line.
|
129
|
+
* @param {Boolean} opts.before Should have a newline before this line.
|
130
|
+
* @returns {void}
|
131
|
+
*/
|
132
|
+
function checkForEmptyLine(node, opts) {
|
133
|
+
|
134
|
+
var lines = context.getSourceLines(),
|
135
|
+
numLines = lines.length + 1,
|
136
|
+
comments = context.getAllComments(),
|
137
|
+
commentLines = getCommentLineNums(comments),
|
138
|
+
emptyLines = getEmptyLineNums(lines),
|
139
|
+
commentAndEmptyLines = commentLines.concat(emptyLines);
|
140
|
+
|
141
|
+
var after = opts.after,
|
142
|
+
before = opts.before;
|
143
|
+
|
144
|
+
var prevLineNum = node.loc.start.line - 1,
|
145
|
+
nextLineNum = node.loc.end.line + 1,
|
146
|
+
commentIsNotAlone = codeAroundComment(node);
|
147
|
+
|
148
|
+
var blockStartAllowed = options.allowBlockStart && isCommentAtBlockStart(node),
|
149
|
+
blockEndAllowed = options.allowBlockEnd && isCommentAtBlockEnd(node);
|
150
|
+
|
151
|
+
// ignore top of the file and bottom of the file
|
152
|
+
if (prevLineNum < 1) {
|
153
|
+
before = false;
|
154
|
+
}
|
155
|
+
if (nextLineNum >= numLines) {
|
156
|
+
after = false;
|
157
|
+
}
|
158
|
+
|
159
|
+
// we ignore all inline comments
|
160
|
+
if (commentIsNotAlone) {
|
161
|
+
return;
|
162
|
+
}
|
163
|
+
|
164
|
+
// check for newline before
|
165
|
+
if (!blockStartAllowed && before && !contains(prevLineNum, commentAndEmptyLines)) {
|
166
|
+
context.report(node, "Expected line before comment.");
|
167
|
+
}
|
168
|
+
|
169
|
+
// check for newline after
|
170
|
+
if (!blockEndAllowed && after && !contains(nextLineNum, commentAndEmptyLines)) {
|
171
|
+
context.report(node, "Expected line after comment.");
|
172
|
+
}
|
173
|
+
|
174
|
+
}
|
175
|
+
|
176
|
+
//--------------------------------------------------------------------------
|
177
|
+
// Public
|
178
|
+
//--------------------------------------------------------------------------
|
179
|
+
|
180
|
+
return {
|
181
|
+
|
182
|
+
"LineComment": function(node) {
|
183
|
+
if (options.beforeLineComment || options.afterLineComment) {
|
184
|
+
checkForEmptyLine(node, {
|
185
|
+
after: options.afterLineComment,
|
186
|
+
before: options.beforeLineComment
|
187
|
+
});
|
188
|
+
}
|
189
|
+
},
|
190
|
+
|
191
|
+
"BlockComment": function(node) {
|
192
|
+
if (options.beforeBlockComment || options.afterBlockComment) {
|
193
|
+
checkForEmptyLine(node, {
|
194
|
+
after: options.afterBlockComment,
|
195
|
+
before: options.beforeBlockComment
|
196
|
+
});
|
197
|
+
}
|
198
|
+
}
|
199
|
+
|
200
|
+
};
|
201
|
+
};
|
202
|
+
|
203
|
+
module.exports.schema = [
|
204
|
+
{
|
205
|
+
"type": "object",
|
206
|
+
"properties": {
|
207
|
+
"beforeBlockComment": {
|
208
|
+
"type": "boolean"
|
209
|
+
},
|
210
|
+
"afterBlockComment": {
|
211
|
+
"type": "boolean"
|
212
|
+
},
|
213
|
+
"beforeLineComment": {
|
214
|
+
"type": "boolean"
|
215
|
+
},
|
216
|
+
"afterLineComment": {
|
217
|
+
"type": "boolean"
|
218
|
+
},
|
219
|
+
"allowBlockStart": {
|
220
|
+
"type": "boolean"
|
221
|
+
},
|
222
|
+
"allowBlockEnd": {
|
223
|
+
"type": "boolean"
|
224
|
+
}
|
225
|
+
},
|
226
|
+
"additionalProperties": false
|
227
|
+
}
|
228
|
+
];
|
package/lib/rules/max-depth.js
CHANGED
@@ -1,89 +1,89 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview A rule to set the maximum depth block can be nested in a function.
|
3
|
-
* @author Ian Christian Myers
|
4
|
-
* @copyright 2013 Ian Christian Myers. All rights reserved.
|
5
|
-
*/
|
6
|
-
|
7
|
-
"use strict";
|
8
|
-
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
// Rule Definition
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
|
13
|
-
module.exports = function(context) {
|
14
|
-
|
15
|
-
//--------------------------------------------------------------------------
|
16
|
-
// Helpers
|
17
|
-
//--------------------------------------------------------------------------
|
18
|
-
|
19
|
-
var functionStack = [],
|
20
|
-
maxDepth = context.options[0] || 4;
|
21
|
-
|
22
|
-
function startFunction() {
|
23
|
-
functionStack.push(0);
|
24
|
-
}
|
25
|
-
|
26
|
-
function endFunction() {
|
27
|
-
functionStack.pop();
|
28
|
-
}
|
29
|
-
|
30
|
-
function pushBlock(node) {
|
31
|
-
var len = ++functionStack[functionStack.length - 1];
|
32
|
-
|
33
|
-
if (len > maxDepth) {
|
34
|
-
context.report(node, "Blocks are nested too deeply ({{depth}}).",
|
35
|
-
{ depth: len });
|
36
|
-
}
|
37
|
-
}
|
38
|
-
|
39
|
-
function popBlock() {
|
40
|
-
functionStack[functionStack.length - 1]--;
|
41
|
-
}
|
42
|
-
|
43
|
-
//--------------------------------------------------------------------------
|
44
|
-
// Public API
|
45
|
-
//--------------------------------------------------------------------------
|
46
|
-
|
47
|
-
return {
|
48
|
-
"Program": startFunction,
|
49
|
-
"FunctionDeclaration": startFunction,
|
50
|
-
"FunctionExpression": startFunction,
|
51
|
-
"ArrowFunctionExpression": startFunction,
|
52
|
-
|
53
|
-
"IfStatement": function(node) {
|
54
|
-
if (node.parent.type !== "IfStatement") {
|
55
|
-
pushBlock(node);
|
56
|
-
}
|
57
|
-
},
|
58
|
-
"SwitchStatement": pushBlock,
|
59
|
-
"TryStatement": pushBlock,
|
60
|
-
"DoWhileStatement": pushBlock,
|
61
|
-
"WhileStatement": pushBlock,
|
62
|
-
"WithStatement": pushBlock,
|
63
|
-
"ForStatement": pushBlock,
|
64
|
-
"ForInStatement": pushBlock,
|
65
|
-
"ForOfStatement": pushBlock,
|
66
|
-
|
67
|
-
"IfStatement:exit": popBlock,
|
68
|
-
"SwitchStatement:exit": popBlock,
|
69
|
-
"TryStatement:exit": popBlock,
|
70
|
-
"DoWhileStatement:exit": popBlock,
|
71
|
-
"WhileStatement:exit": popBlock,
|
72
|
-
"WithStatement:exit": popBlock,
|
73
|
-
"ForStatement:exit": popBlock,
|
74
|
-
"ForInStatement:exit": popBlock,
|
75
|
-
"ForOfStatement:exit": popBlock,
|
76
|
-
|
77
|
-
"FunctionDeclaration:exit": endFunction,
|
78
|
-
"FunctionExpression:exit": endFunction,
|
79
|
-
"ArrowFunctionExpression:exit": endFunction,
|
80
|
-
"Program:exit": endFunction
|
81
|
-
};
|
82
|
-
|
83
|
-
};
|
84
|
-
|
85
|
-
module.exports.schema = [
|
86
|
-
{
|
87
|
-
"type": "integer"
|
88
|
-
}
|
89
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview A rule to set the maximum depth block can be nested in a function.
|
3
|
+
* @author Ian Christian Myers
|
4
|
+
* @copyright 2013 Ian Christian Myers. All rights reserved.
|
5
|
+
*/
|
6
|
+
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
// Rule Definition
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
module.exports = function(context) {
|
14
|
+
|
15
|
+
//--------------------------------------------------------------------------
|
16
|
+
// Helpers
|
17
|
+
//--------------------------------------------------------------------------
|
18
|
+
|
19
|
+
var functionStack = [],
|
20
|
+
maxDepth = context.options[0] || 4;
|
21
|
+
|
22
|
+
function startFunction() {
|
23
|
+
functionStack.push(0);
|
24
|
+
}
|
25
|
+
|
26
|
+
function endFunction() {
|
27
|
+
functionStack.pop();
|
28
|
+
}
|
29
|
+
|
30
|
+
function pushBlock(node) {
|
31
|
+
var len = ++functionStack[functionStack.length - 1];
|
32
|
+
|
33
|
+
if (len > maxDepth) {
|
34
|
+
context.report(node, "Blocks are nested too deeply ({{depth}}).",
|
35
|
+
{ depth: len });
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
function popBlock() {
|
40
|
+
functionStack[functionStack.length - 1]--;
|
41
|
+
}
|
42
|
+
|
43
|
+
//--------------------------------------------------------------------------
|
44
|
+
// Public API
|
45
|
+
//--------------------------------------------------------------------------
|
46
|
+
|
47
|
+
return {
|
48
|
+
"Program": startFunction,
|
49
|
+
"FunctionDeclaration": startFunction,
|
50
|
+
"FunctionExpression": startFunction,
|
51
|
+
"ArrowFunctionExpression": startFunction,
|
52
|
+
|
53
|
+
"IfStatement": function(node) {
|
54
|
+
if (node.parent.type !== "IfStatement") {
|
55
|
+
pushBlock(node);
|
56
|
+
}
|
57
|
+
},
|
58
|
+
"SwitchStatement": pushBlock,
|
59
|
+
"TryStatement": pushBlock,
|
60
|
+
"DoWhileStatement": pushBlock,
|
61
|
+
"WhileStatement": pushBlock,
|
62
|
+
"WithStatement": pushBlock,
|
63
|
+
"ForStatement": pushBlock,
|
64
|
+
"ForInStatement": pushBlock,
|
65
|
+
"ForOfStatement": pushBlock,
|
66
|
+
|
67
|
+
"IfStatement:exit": popBlock,
|
68
|
+
"SwitchStatement:exit": popBlock,
|
69
|
+
"TryStatement:exit": popBlock,
|
70
|
+
"DoWhileStatement:exit": popBlock,
|
71
|
+
"WhileStatement:exit": popBlock,
|
72
|
+
"WithStatement:exit": popBlock,
|
73
|
+
"ForStatement:exit": popBlock,
|
74
|
+
"ForInStatement:exit": popBlock,
|
75
|
+
"ForOfStatement:exit": popBlock,
|
76
|
+
|
77
|
+
"FunctionDeclaration:exit": endFunction,
|
78
|
+
"FunctionExpression:exit": endFunction,
|
79
|
+
"ArrowFunctionExpression:exit": endFunction,
|
80
|
+
"Program:exit": endFunction
|
81
|
+
};
|
82
|
+
|
83
|
+
};
|
84
|
+
|
85
|
+
module.exports.schema = [
|
86
|
+
{
|
87
|
+
"type": "integer"
|
88
|
+
}
|
89
|
+
];
|