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,167 +1,167 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Validates spacing before and after semicolon
|
3
|
-
* @author Mathias Schreck
|
4
|
-
* @copyright 2015 Mathias Schreck
|
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
|
-
requireSpaceBefore = false,
|
17
|
-
requireSpaceAfter = true;
|
18
|
-
|
19
|
-
if (typeof config === "object") {
|
20
|
-
if (config.hasOwnProperty("before")) {
|
21
|
-
requireSpaceBefore = config.before;
|
22
|
-
}
|
23
|
-
if (config.hasOwnProperty("after")) {
|
24
|
-
requireSpaceAfter = config.after;
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
/**
|
29
|
-
* Determines whether two adjacent tokens have whitespace between them.
|
30
|
-
* @param {Object} left - The left token object.
|
31
|
-
* @param {Object} right - The right token object.
|
32
|
-
* @returns {boolean} Whether or not there is space between the tokens.
|
33
|
-
*/
|
34
|
-
function isSpaced(left, right) {
|
35
|
-
return left.range[1] < right.range[0];
|
36
|
-
}
|
37
|
-
|
38
|
-
/**
|
39
|
-
* Checks whether two tokens are on the same line.
|
40
|
-
* @param {Object} left The leftmost token.
|
41
|
-
* @param {Object} right The rightmost token.
|
42
|
-
* @returns {boolean} True if the tokens are on the same line, false if not.
|
43
|
-
* @private
|
44
|
-
*/
|
45
|
-
function isSameLine(left, right) {
|
46
|
-
return left.loc.end.line === right.loc.start.line;
|
47
|
-
}
|
48
|
-
|
49
|
-
/**
|
50
|
-
* Checks if a given token has leading whitespace.
|
51
|
-
* @param {Object} token The token to check.
|
52
|
-
* @returns {boolean} True if the given token has leading space, false if not.
|
53
|
-
*/
|
54
|
-
function hasLeadingSpace(token) {
|
55
|
-
var tokenBefore = context.getTokenBefore(token);
|
56
|
-
return tokenBefore && isSameLine(tokenBefore, token) && isSpaced(tokenBefore, token);
|
57
|
-
}
|
58
|
-
|
59
|
-
/**
|
60
|
-
* Checks if a given token has trailing whitespace.
|
61
|
-
* @param {Object} token The token to check.
|
62
|
-
* @returns {boolean} True if the given token has trailing space, false if not.
|
63
|
-
*/
|
64
|
-
function hasTrailingSpace(token) {
|
65
|
-
var tokenAfter = context.getTokenAfter(token);
|
66
|
-
return tokenAfter && isSameLine(token, tokenAfter) && isSpaced(token, tokenAfter);
|
67
|
-
}
|
68
|
-
|
69
|
-
/**
|
70
|
-
* Checks if the given token is the last token in its line.
|
71
|
-
* @param {Token} token The token to check.
|
72
|
-
* @returns {boolean} Whether or not the token is the last in its line.
|
73
|
-
*/
|
74
|
-
function isLastTokenInCurrentLine(token) {
|
75
|
-
var tokenAfter = context.getTokenAfter(token);
|
76
|
-
return !(tokenAfter && isSameLine(token, tokenAfter));
|
77
|
-
}
|
78
|
-
|
79
|
-
/**
|
80
|
-
* Checks if the given token is a semicolon.
|
81
|
-
* @param {Token} token The token to check.
|
82
|
-
* @returns {boolean} Whether or not the given token is a semicolon.
|
83
|
-
*/
|
84
|
-
function isSemicolon(token) {
|
85
|
-
return token.type === "Punctuator" && token.value === ";";
|
86
|
-
}
|
87
|
-
|
88
|
-
/**
|
89
|
-
* Reports if the given token has invalid spacing.
|
90
|
-
* @param {Token} token The semicolon token to check.
|
91
|
-
* @param {ASTNode} node The corresponding node of the token.
|
92
|
-
* @returns {void}
|
93
|
-
*/
|
94
|
-
function checkSemicolonSpacing(token, node) {
|
95
|
-
var location;
|
96
|
-
|
97
|
-
if (isSemicolon(token)) {
|
98
|
-
location = token.loc.start;
|
99
|
-
|
100
|
-
if (hasLeadingSpace(token)) {
|
101
|
-
if (!requireSpaceBefore) {
|
102
|
-
context.report(node, location, "Unexpected whitespace before semicolon.");
|
103
|
-
}
|
104
|
-
} else {
|
105
|
-
if (requireSpaceBefore) {
|
106
|
-
context.report(node, location, "Missing whitespace before semicolon.");
|
107
|
-
}
|
108
|
-
}
|
109
|
-
|
110
|
-
if (!isLastTokenInCurrentLine(token)) {
|
111
|
-
if (hasTrailingSpace(token)) {
|
112
|
-
if (!requireSpaceAfter) {
|
113
|
-
context.report(node, location, "Unexpected whitespace after semicolon.");
|
114
|
-
}
|
115
|
-
} else {
|
116
|
-
if (requireSpaceAfter) {
|
117
|
-
context.report(node, location, "Missing whitespace after semicolon.");
|
118
|
-
}
|
119
|
-
}
|
120
|
-
}
|
121
|
-
}
|
122
|
-
}
|
123
|
-
|
124
|
-
/**
|
125
|
-
* Checks the spacing of the semicolon with the assumption that the last token is the semicolon.
|
126
|
-
* @param {ASTNode} node The node to check.
|
127
|
-
* @returns {void}
|
128
|
-
*/
|
129
|
-
function checkNode(node) {
|
130
|
-
var token = context.getLastToken(node);
|
131
|
-
checkSemicolonSpacing(token, node);
|
132
|
-
}
|
133
|
-
|
134
|
-
return {
|
135
|
-
"VariableDeclaration": checkNode,
|
136
|
-
"ExpressionStatement": checkNode,
|
137
|
-
"BreakStatement": checkNode,
|
138
|
-
"ContinueStatement": checkNode,
|
139
|
-
"DebuggerStatement": checkNode,
|
140
|
-
"ReturnStatement": checkNode,
|
141
|
-
"ThrowStatement": checkNode,
|
142
|
-
"ForStatement": function (node) {
|
143
|
-
if (node.init) {
|
144
|
-
checkSemicolonSpacing(context.getTokenAfter(node.init), node);
|
145
|
-
}
|
146
|
-
|
147
|
-
if (node.test) {
|
148
|
-
checkSemicolonSpacing(context.getTokenAfter(node.test), node);
|
149
|
-
}
|
150
|
-
}
|
151
|
-
};
|
152
|
-
};
|
153
|
-
|
154
|
-
module.exports.schema = [
|
155
|
-
{
|
156
|
-
"type": "object",
|
157
|
-
"properties": {
|
158
|
-
"before": {
|
159
|
-
"type": "boolean"
|
160
|
-
},
|
161
|
-
"after": {
|
162
|
-
"type": "boolean"
|
163
|
-
}
|
164
|
-
},
|
165
|
-
"additionalProperties": false
|
166
|
-
}
|
167
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Validates spacing before and after semicolon
|
3
|
+
* @author Mathias Schreck
|
4
|
+
* @copyright 2015 Mathias Schreck
|
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
|
+
requireSpaceBefore = false,
|
17
|
+
requireSpaceAfter = true;
|
18
|
+
|
19
|
+
if (typeof config === "object") {
|
20
|
+
if (config.hasOwnProperty("before")) {
|
21
|
+
requireSpaceBefore = config.before;
|
22
|
+
}
|
23
|
+
if (config.hasOwnProperty("after")) {
|
24
|
+
requireSpaceAfter = config.after;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Determines whether two adjacent tokens have whitespace between them.
|
30
|
+
* @param {Object} left - The left token object.
|
31
|
+
* @param {Object} right - The right token object.
|
32
|
+
* @returns {boolean} Whether or not there is space between the tokens.
|
33
|
+
*/
|
34
|
+
function isSpaced(left, right) {
|
35
|
+
return left.range[1] < right.range[0];
|
36
|
+
}
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Checks whether two tokens are on the same line.
|
40
|
+
* @param {Object} left The leftmost token.
|
41
|
+
* @param {Object} right The rightmost token.
|
42
|
+
* @returns {boolean} True if the tokens are on the same line, false if not.
|
43
|
+
* @private
|
44
|
+
*/
|
45
|
+
function isSameLine(left, right) {
|
46
|
+
return left.loc.end.line === right.loc.start.line;
|
47
|
+
}
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Checks if a given token has leading whitespace.
|
51
|
+
* @param {Object} token The token to check.
|
52
|
+
* @returns {boolean} True if the given token has leading space, false if not.
|
53
|
+
*/
|
54
|
+
function hasLeadingSpace(token) {
|
55
|
+
var tokenBefore = context.getTokenBefore(token);
|
56
|
+
return tokenBefore && isSameLine(tokenBefore, token) && isSpaced(tokenBefore, token);
|
57
|
+
}
|
58
|
+
|
59
|
+
/**
|
60
|
+
* Checks if a given token has trailing whitespace.
|
61
|
+
* @param {Object} token The token to check.
|
62
|
+
* @returns {boolean} True if the given token has trailing space, false if not.
|
63
|
+
*/
|
64
|
+
function hasTrailingSpace(token) {
|
65
|
+
var tokenAfter = context.getTokenAfter(token);
|
66
|
+
return tokenAfter && isSameLine(token, tokenAfter) && isSpaced(token, tokenAfter);
|
67
|
+
}
|
68
|
+
|
69
|
+
/**
|
70
|
+
* Checks if the given token is the last token in its line.
|
71
|
+
* @param {Token} token The token to check.
|
72
|
+
* @returns {boolean} Whether or not the token is the last in its line.
|
73
|
+
*/
|
74
|
+
function isLastTokenInCurrentLine(token) {
|
75
|
+
var tokenAfter = context.getTokenAfter(token);
|
76
|
+
return !(tokenAfter && isSameLine(token, tokenAfter));
|
77
|
+
}
|
78
|
+
|
79
|
+
/**
|
80
|
+
* Checks if the given token is a semicolon.
|
81
|
+
* @param {Token} token The token to check.
|
82
|
+
* @returns {boolean} Whether or not the given token is a semicolon.
|
83
|
+
*/
|
84
|
+
function isSemicolon(token) {
|
85
|
+
return token.type === "Punctuator" && token.value === ";";
|
86
|
+
}
|
87
|
+
|
88
|
+
/**
|
89
|
+
* Reports if the given token has invalid spacing.
|
90
|
+
* @param {Token} token The semicolon token to check.
|
91
|
+
* @param {ASTNode} node The corresponding node of the token.
|
92
|
+
* @returns {void}
|
93
|
+
*/
|
94
|
+
function checkSemicolonSpacing(token, node) {
|
95
|
+
var location;
|
96
|
+
|
97
|
+
if (isSemicolon(token)) {
|
98
|
+
location = token.loc.start;
|
99
|
+
|
100
|
+
if (hasLeadingSpace(token)) {
|
101
|
+
if (!requireSpaceBefore) {
|
102
|
+
context.report(node, location, "Unexpected whitespace before semicolon.");
|
103
|
+
}
|
104
|
+
} else {
|
105
|
+
if (requireSpaceBefore) {
|
106
|
+
context.report(node, location, "Missing whitespace before semicolon.");
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
if (!isLastTokenInCurrentLine(token)) {
|
111
|
+
if (hasTrailingSpace(token)) {
|
112
|
+
if (!requireSpaceAfter) {
|
113
|
+
context.report(node, location, "Unexpected whitespace after semicolon.");
|
114
|
+
}
|
115
|
+
} else {
|
116
|
+
if (requireSpaceAfter) {
|
117
|
+
context.report(node, location, "Missing whitespace after semicolon.");
|
118
|
+
}
|
119
|
+
}
|
120
|
+
}
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
/**
|
125
|
+
* Checks the spacing of the semicolon with the assumption that the last token is the semicolon.
|
126
|
+
* @param {ASTNode} node The node to check.
|
127
|
+
* @returns {void}
|
128
|
+
*/
|
129
|
+
function checkNode(node) {
|
130
|
+
var token = context.getLastToken(node);
|
131
|
+
checkSemicolonSpacing(token, node);
|
132
|
+
}
|
133
|
+
|
134
|
+
return {
|
135
|
+
"VariableDeclaration": checkNode,
|
136
|
+
"ExpressionStatement": checkNode,
|
137
|
+
"BreakStatement": checkNode,
|
138
|
+
"ContinueStatement": checkNode,
|
139
|
+
"DebuggerStatement": checkNode,
|
140
|
+
"ReturnStatement": checkNode,
|
141
|
+
"ThrowStatement": checkNode,
|
142
|
+
"ForStatement": function (node) {
|
143
|
+
if (node.init) {
|
144
|
+
checkSemicolonSpacing(context.getTokenAfter(node.init), node);
|
145
|
+
}
|
146
|
+
|
147
|
+
if (node.test) {
|
148
|
+
checkSemicolonSpacing(context.getTokenAfter(node.test), node);
|
149
|
+
}
|
150
|
+
}
|
151
|
+
};
|
152
|
+
};
|
153
|
+
|
154
|
+
module.exports.schema = [
|
155
|
+
{
|
156
|
+
"type": "object",
|
157
|
+
"properties": {
|
158
|
+
"before": {
|
159
|
+
"type": "boolean"
|
160
|
+
},
|
161
|
+
"after": {
|
162
|
+
"type": "boolean"
|
163
|
+
}
|
164
|
+
},
|
165
|
+
"additionalProperties": false
|
166
|
+
}
|
167
|
+
];
|
package/lib/rules/semi.js
CHANGED
@@ -1,136 +1,136 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag missing semicolons.
|
3
|
-
* @author Nicholas C. Zakas
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
//------------------------------------------------------------------------------
|
8
|
-
// Rule Definition
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
module.exports = function(context) {
|
11
|
-
|
12
|
-
var OPT_OUT_PATTERN = /[\[\(\/\+\-]/; // One of [(/+-
|
13
|
-
|
14
|
-
var always = context.options[0] !== "never";
|
15
|
-
|
16
|
-
//--------------------------------------------------------------------------
|
17
|
-
// Helpers
|
18
|
-
//--------------------------------------------------------------------------
|
19
|
-
|
20
|
-
/**
|
21
|
-
* Reports a semicolon error with appropriate location and message.
|
22
|
-
* @param {ASTNode} node The node with an extra or missing semicolon.
|
23
|
-
* @returns {void}
|
24
|
-
*/
|
25
|
-
function report(node) {
|
26
|
-
var message = always ? "Missing semicolon." : "Extra semicolon.";
|
27
|
-
context.report(node, context.getLastToken(node).loc.end, message);
|
28
|
-
}
|
29
|
-
|
30
|
-
/**
|
31
|
-
* Checks whether a token is a semicolon punctuator.
|
32
|
-
* @param {Token} token The token.
|
33
|
-
* @returns {boolean} True if token is a semicolon punctuator.
|
34
|
-
*/
|
35
|
-
function isSemicolon(token) {
|
36
|
-
return (token.type === "Punctuator" && token.value === ";");
|
37
|
-
}
|
38
|
-
|
39
|
-
/**
|
40
|
-
* Check if a semicolon is unnecessary, only true if:
|
41
|
-
* - next token is on a new line and is not one of the opt-out tokens
|
42
|
-
* - next token is a valid statement divider
|
43
|
-
* @param {Token} lastToken last token of current node.
|
44
|
-
* @returns {boolean} whether the semicolon is unnecessary.
|
45
|
-
*/
|
46
|
-
function isUnnecessarySemicolon(lastToken) {
|
47
|
-
var isDivider, isOptOutToken, lastTokenLine, nextToken, nextTokenLine;
|
48
|
-
|
49
|
-
if (!isSemicolon(lastToken)) {
|
50
|
-
return false;
|
51
|
-
}
|
52
|
-
|
53
|
-
nextToken = context.getTokenAfter(lastToken);
|
54
|
-
|
55
|
-
if (!nextToken) {
|
56
|
-
return true;
|
57
|
-
}
|
58
|
-
|
59
|
-
lastTokenLine = lastToken.loc.end.line;
|
60
|
-
nextTokenLine = nextToken.loc.start.line;
|
61
|
-
isOptOutToken = OPT_OUT_PATTERN.test(nextToken.value);
|
62
|
-
isDivider = (nextToken.value === "}" || nextToken.value === ";");
|
63
|
-
|
64
|
-
return (lastTokenLine !== nextTokenLine && !isOptOutToken) || isDivider;
|
65
|
-
}
|
66
|
-
|
67
|
-
/**
|
68
|
-
* Checks a node to see if it's followed by a semicolon.
|
69
|
-
* @param {ASTNode} node The node to check.
|
70
|
-
* @returns {void}
|
71
|
-
*/
|
72
|
-
function checkForSemicolon(node) {
|
73
|
-
var lastToken = context.getLastToken(node);
|
74
|
-
|
75
|
-
if (always) {
|
76
|
-
if (!isSemicolon(lastToken)) {
|
77
|
-
report(node);
|
78
|
-
}
|
79
|
-
} else {
|
80
|
-
if (isUnnecessarySemicolon(lastToken)) {
|
81
|
-
report(node);
|
82
|
-
}
|
83
|
-
}
|
84
|
-
}
|
85
|
-
|
86
|
-
/**
|
87
|
-
* Checks to see if there's a semicolon after a variable declaration.
|
88
|
-
* @param {ASTNode} node The node to check.
|
89
|
-
* @returns {void}
|
90
|
-
*/
|
91
|
-
function checkForSemicolonForVariableDeclaration(node) {
|
92
|
-
var ancestors = context.getAncestors(),
|
93
|
-
parentIndex = ancestors.length - 1,
|
94
|
-
parent = ancestors[parentIndex];
|
95
|
-
|
96
|
-
if ((parent.type !== "ForStatement" || parent.init !== node) &&
|
97
|
-
(!/^For(?:In|Of)Statement/.test(parent.type) || parent.left !== node)
|
98
|
-
) {
|
99
|
-
checkForSemicolon(node);
|
100
|
-
}
|
101
|
-
}
|
102
|
-
|
103
|
-
//--------------------------------------------------------------------------
|
104
|
-
// Public API
|
105
|
-
//--------------------------------------------------------------------------
|
106
|
-
|
107
|
-
return {
|
108
|
-
|
109
|
-
"VariableDeclaration": checkForSemicolonForVariableDeclaration,
|
110
|
-
"ExpressionStatement": checkForSemicolon,
|
111
|
-
"ReturnStatement": checkForSemicolon,
|
112
|
-
"ThrowStatement": checkForSemicolon,
|
113
|
-
"DebuggerStatement": checkForSemicolon,
|
114
|
-
"BreakStatement": checkForSemicolon,
|
115
|
-
"ContinueStatement": checkForSemicolon,
|
116
|
-
"ImportDeclaration": checkForSemicolon,
|
117
|
-
"ExportAllDeclaration": checkForSemicolon,
|
118
|
-
"ExportNamedDeclaration": function (node) {
|
119
|
-
if (!node.declaration) {
|
120
|
-
checkForSemicolon(node);
|
121
|
-
}
|
122
|
-
},
|
123
|
-
"ExportDefaultDeclaration": function (node) {
|
124
|
-
if (!/(?:Class|Function)Declaration/.test(node.declaration.type)) {
|
125
|
-
checkForSemicolon(node);
|
126
|
-
}
|
127
|
-
}
|
128
|
-
};
|
129
|
-
|
130
|
-
};
|
131
|
-
|
132
|
-
module.exports.schema = [
|
133
|
-
{
|
134
|
-
"enum": ["always", "never"]
|
135
|
-
}
|
136
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag missing semicolons.
|
3
|
+
* @author Nicholas C. Zakas
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
//------------------------------------------------------------------------------
|
8
|
+
// Rule Definition
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
module.exports = function(context) {
|
11
|
+
|
12
|
+
var OPT_OUT_PATTERN = /[\[\(\/\+\-]/; // One of [(/+-
|
13
|
+
|
14
|
+
var always = context.options[0] !== "never";
|
15
|
+
|
16
|
+
//--------------------------------------------------------------------------
|
17
|
+
// Helpers
|
18
|
+
//--------------------------------------------------------------------------
|
19
|
+
|
20
|
+
/**
|
21
|
+
* Reports a semicolon error with appropriate location and message.
|
22
|
+
* @param {ASTNode} node The node with an extra or missing semicolon.
|
23
|
+
* @returns {void}
|
24
|
+
*/
|
25
|
+
function report(node) {
|
26
|
+
var message = always ? "Missing semicolon." : "Extra semicolon.";
|
27
|
+
context.report(node, context.getLastToken(node).loc.end, message);
|
28
|
+
}
|
29
|
+
|
30
|
+
/**
|
31
|
+
* Checks whether a token is a semicolon punctuator.
|
32
|
+
* @param {Token} token The token.
|
33
|
+
* @returns {boolean} True if token is a semicolon punctuator.
|
34
|
+
*/
|
35
|
+
function isSemicolon(token) {
|
36
|
+
return (token.type === "Punctuator" && token.value === ";");
|
37
|
+
}
|
38
|
+
|
39
|
+
/**
|
40
|
+
* Check if a semicolon is unnecessary, only true if:
|
41
|
+
* - next token is on a new line and is not one of the opt-out tokens
|
42
|
+
* - next token is a valid statement divider
|
43
|
+
* @param {Token} lastToken last token of current node.
|
44
|
+
* @returns {boolean} whether the semicolon is unnecessary.
|
45
|
+
*/
|
46
|
+
function isUnnecessarySemicolon(lastToken) {
|
47
|
+
var isDivider, isOptOutToken, lastTokenLine, nextToken, nextTokenLine;
|
48
|
+
|
49
|
+
if (!isSemicolon(lastToken)) {
|
50
|
+
return false;
|
51
|
+
}
|
52
|
+
|
53
|
+
nextToken = context.getTokenAfter(lastToken);
|
54
|
+
|
55
|
+
if (!nextToken) {
|
56
|
+
return true;
|
57
|
+
}
|
58
|
+
|
59
|
+
lastTokenLine = lastToken.loc.end.line;
|
60
|
+
nextTokenLine = nextToken.loc.start.line;
|
61
|
+
isOptOutToken = OPT_OUT_PATTERN.test(nextToken.value);
|
62
|
+
isDivider = (nextToken.value === "}" || nextToken.value === ";");
|
63
|
+
|
64
|
+
return (lastTokenLine !== nextTokenLine && !isOptOutToken) || isDivider;
|
65
|
+
}
|
66
|
+
|
67
|
+
/**
|
68
|
+
* Checks a node to see if it's followed by a semicolon.
|
69
|
+
* @param {ASTNode} node The node to check.
|
70
|
+
* @returns {void}
|
71
|
+
*/
|
72
|
+
function checkForSemicolon(node) {
|
73
|
+
var lastToken = context.getLastToken(node);
|
74
|
+
|
75
|
+
if (always) {
|
76
|
+
if (!isSemicolon(lastToken)) {
|
77
|
+
report(node);
|
78
|
+
}
|
79
|
+
} else {
|
80
|
+
if (isUnnecessarySemicolon(lastToken)) {
|
81
|
+
report(node);
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
/**
|
87
|
+
* Checks to see if there's a semicolon after a variable declaration.
|
88
|
+
* @param {ASTNode} node The node to check.
|
89
|
+
* @returns {void}
|
90
|
+
*/
|
91
|
+
function checkForSemicolonForVariableDeclaration(node) {
|
92
|
+
var ancestors = context.getAncestors(),
|
93
|
+
parentIndex = ancestors.length - 1,
|
94
|
+
parent = ancestors[parentIndex];
|
95
|
+
|
96
|
+
if ((parent.type !== "ForStatement" || parent.init !== node) &&
|
97
|
+
(!/^For(?:In|Of)Statement/.test(parent.type) || parent.left !== node)
|
98
|
+
) {
|
99
|
+
checkForSemicolon(node);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
//--------------------------------------------------------------------------
|
104
|
+
// Public API
|
105
|
+
//--------------------------------------------------------------------------
|
106
|
+
|
107
|
+
return {
|
108
|
+
|
109
|
+
"VariableDeclaration": checkForSemicolonForVariableDeclaration,
|
110
|
+
"ExpressionStatement": checkForSemicolon,
|
111
|
+
"ReturnStatement": checkForSemicolon,
|
112
|
+
"ThrowStatement": checkForSemicolon,
|
113
|
+
"DebuggerStatement": checkForSemicolon,
|
114
|
+
"BreakStatement": checkForSemicolon,
|
115
|
+
"ContinueStatement": checkForSemicolon,
|
116
|
+
"ImportDeclaration": checkForSemicolon,
|
117
|
+
"ExportAllDeclaration": checkForSemicolon,
|
118
|
+
"ExportNamedDeclaration": function (node) {
|
119
|
+
if (!node.declaration) {
|
120
|
+
checkForSemicolon(node);
|
121
|
+
}
|
122
|
+
},
|
123
|
+
"ExportDefaultDeclaration": function (node) {
|
124
|
+
if (!/(?:Class|Function)Declaration/.test(node.declaration.type)) {
|
125
|
+
checkForSemicolon(node);
|
126
|
+
}
|
127
|
+
}
|
128
|
+
};
|
129
|
+
|
130
|
+
};
|
131
|
+
|
132
|
+
module.exports.schema = [
|
133
|
+
{
|
134
|
+
"enum": ["always", "never"]
|
135
|
+
}
|
136
|
+
];
|