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,106 +1,106 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Require spaces around infix operators
|
3
|
-
* @author Michael Ficarra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
//------------------------------------------------------------------------------
|
8
|
-
// Rule Definition
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
|
11
|
-
module.exports = function(context) {
|
12
|
-
var int32Hint = context.options[0] ? context.options[0].int32Hint === true : false;
|
13
|
-
|
14
|
-
var OPERATORS = [
|
15
|
-
"*", "/", "%", "+", "-", "<<", ">>", ">>>", "<", "<=", ">", ">=", "in",
|
16
|
-
"instanceof", "==", "!=", "===", "!==", "&", "^", "|", "&&", "||", "=",
|
17
|
-
"+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "&=", "^=", "|=",
|
18
|
-
"?", ":", ","
|
19
|
-
];
|
20
|
-
|
21
|
-
/**
|
22
|
-
* Returns the first token which violates the rule
|
23
|
-
* @param {ASTNode} left - The left node of the main node
|
24
|
-
* @param {ASTNode} right - The right node of the main node
|
25
|
-
* @returns {object} The violator token or null
|
26
|
-
* @private
|
27
|
-
*/
|
28
|
-
function getFirstNonSpacedToken(left, right) {
|
29
|
-
var op, tokens = context.getTokensBetween(left, right, 1);
|
30
|
-
for (var i = 1, l = tokens.length - 1; i < l; ++i) {
|
31
|
-
op = tokens[i];
|
32
|
-
if (
|
33
|
-
op.type === "Punctuator" &&
|
34
|
-
OPERATORS.indexOf(op.value) >= 0 &&
|
35
|
-
(tokens[i - 1].range[1] >= op.range[0] || op.range[1] >= tokens[i + 1].range[0])
|
36
|
-
) {
|
37
|
-
return op;
|
38
|
-
}
|
39
|
-
}
|
40
|
-
return null;
|
41
|
-
}
|
42
|
-
|
43
|
-
/**
|
44
|
-
* Reports an AST node as a rule violation
|
45
|
-
* @param {ASTNode} mainNode - The node to report
|
46
|
-
* @param {object} culpritToken - The token which has a problem
|
47
|
-
* @returns {void}
|
48
|
-
* @private
|
49
|
-
*/
|
50
|
-
function report(mainNode, culpritToken) {
|
51
|
-
context.report(mainNode, culpritToken.loc.start, "Infix operators must be spaced.");
|
52
|
-
}
|
53
|
-
|
54
|
-
function checkBinary(node) {
|
55
|
-
var nonSpacedNode = getFirstNonSpacedToken(node.left, node.right);
|
56
|
-
|
57
|
-
if (nonSpacedNode) {
|
58
|
-
if (!(int32Hint && context.getSource(node).substr(-2) === "|0")) {
|
59
|
-
report(node, nonSpacedNode);
|
60
|
-
}
|
61
|
-
}
|
62
|
-
}
|
63
|
-
|
64
|
-
function checkConditional(node) {
|
65
|
-
var nonSpacedConsequesntNode = getFirstNonSpacedToken(node.test, node.consequent);
|
66
|
-
var nonSpacedAlternateNode = getFirstNonSpacedToken(node.consequent, node.alternate);
|
67
|
-
|
68
|
-
if (nonSpacedConsequesntNode) {
|
69
|
-
report(node, nonSpacedConsequesntNode);
|
70
|
-
} else if (nonSpacedAlternateNode) {
|
71
|
-
report(node, nonSpacedAlternateNode);
|
72
|
-
}
|
73
|
-
}
|
74
|
-
|
75
|
-
function checkVar(node) {
|
76
|
-
var nonSpacedNode;
|
77
|
-
|
78
|
-
if (node.init) {
|
79
|
-
nonSpacedNode = getFirstNonSpacedToken(node.id, node.init);
|
80
|
-
if (nonSpacedNode) {
|
81
|
-
report(node, nonSpacedNode);
|
82
|
-
}
|
83
|
-
}
|
84
|
-
}
|
85
|
-
|
86
|
-
return {
|
87
|
-
"AssignmentExpression": checkBinary,
|
88
|
-
"BinaryExpression": checkBinary,
|
89
|
-
"LogicalExpression": checkBinary,
|
90
|
-
"ConditionalExpression": checkConditional,
|
91
|
-
"VariableDeclarator": checkVar
|
92
|
-
};
|
93
|
-
|
94
|
-
};
|
95
|
-
|
96
|
-
module.exports.schema = [
|
97
|
-
{
|
98
|
-
"type": "object",
|
99
|
-
"properties": {
|
100
|
-
"int32Hint": {
|
101
|
-
"type": "boolean"
|
102
|
-
}
|
103
|
-
},
|
104
|
-
"additionalProperties": false
|
105
|
-
}
|
106
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Require spaces around infix operators
|
3
|
+
* @author Michael Ficarra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
//------------------------------------------------------------------------------
|
8
|
+
// Rule Definition
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
|
11
|
+
module.exports = function(context) {
|
12
|
+
var int32Hint = context.options[0] ? context.options[0].int32Hint === true : false;
|
13
|
+
|
14
|
+
var OPERATORS = [
|
15
|
+
"*", "/", "%", "+", "-", "<<", ">>", ">>>", "<", "<=", ">", ">=", "in",
|
16
|
+
"instanceof", "==", "!=", "===", "!==", "&", "^", "|", "&&", "||", "=",
|
17
|
+
"+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "&=", "^=", "|=",
|
18
|
+
"?", ":", ","
|
19
|
+
];
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Returns the first token which violates the rule
|
23
|
+
* @param {ASTNode} left - The left node of the main node
|
24
|
+
* @param {ASTNode} right - The right node of the main node
|
25
|
+
* @returns {object} The violator token or null
|
26
|
+
* @private
|
27
|
+
*/
|
28
|
+
function getFirstNonSpacedToken(left, right) {
|
29
|
+
var op, tokens = context.getTokensBetween(left, right, 1);
|
30
|
+
for (var i = 1, l = tokens.length - 1; i < l; ++i) {
|
31
|
+
op = tokens[i];
|
32
|
+
if (
|
33
|
+
op.type === "Punctuator" &&
|
34
|
+
OPERATORS.indexOf(op.value) >= 0 &&
|
35
|
+
(tokens[i - 1].range[1] >= op.range[0] || op.range[1] >= tokens[i + 1].range[0])
|
36
|
+
) {
|
37
|
+
return op;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
return null;
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Reports an AST node as a rule violation
|
45
|
+
* @param {ASTNode} mainNode - The node to report
|
46
|
+
* @param {object} culpritToken - The token which has a problem
|
47
|
+
* @returns {void}
|
48
|
+
* @private
|
49
|
+
*/
|
50
|
+
function report(mainNode, culpritToken) {
|
51
|
+
context.report(mainNode, culpritToken.loc.start, "Infix operators must be spaced.");
|
52
|
+
}
|
53
|
+
|
54
|
+
function checkBinary(node) {
|
55
|
+
var nonSpacedNode = getFirstNonSpacedToken(node.left, node.right);
|
56
|
+
|
57
|
+
if (nonSpacedNode) {
|
58
|
+
if (!(int32Hint && context.getSource(node).substr(-2) === "|0")) {
|
59
|
+
report(node, nonSpacedNode);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
function checkConditional(node) {
|
65
|
+
var nonSpacedConsequesntNode = getFirstNonSpacedToken(node.test, node.consequent);
|
66
|
+
var nonSpacedAlternateNode = getFirstNonSpacedToken(node.consequent, node.alternate);
|
67
|
+
|
68
|
+
if (nonSpacedConsequesntNode) {
|
69
|
+
report(node, nonSpacedConsequesntNode);
|
70
|
+
} else if (nonSpacedAlternateNode) {
|
71
|
+
report(node, nonSpacedAlternateNode);
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
function checkVar(node) {
|
76
|
+
var nonSpacedNode;
|
77
|
+
|
78
|
+
if (node.init) {
|
79
|
+
nonSpacedNode = getFirstNonSpacedToken(node.id, node.init);
|
80
|
+
if (nonSpacedNode) {
|
81
|
+
report(node, nonSpacedNode);
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
return {
|
87
|
+
"AssignmentExpression": checkBinary,
|
88
|
+
"BinaryExpression": checkBinary,
|
89
|
+
"LogicalExpression": checkBinary,
|
90
|
+
"ConditionalExpression": checkConditional,
|
91
|
+
"VariableDeclarator": checkVar
|
92
|
+
};
|
93
|
+
|
94
|
+
};
|
95
|
+
|
96
|
+
module.exports.schema = [
|
97
|
+
{
|
98
|
+
"type": "object",
|
99
|
+
"properties": {
|
100
|
+
"int32Hint": {
|
101
|
+
"type": "boolean"
|
102
|
+
}
|
103
|
+
},
|
104
|
+
"additionalProperties": false
|
105
|
+
}
|
106
|
+
];
|
@@ -1,38 +1,38 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Require spaces following return, throw, and case
|
3
|
-
* @author Michael Ficarra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
//------------------------------------------------------------------------------
|
8
|
-
// Rule Definition
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
|
11
|
-
module.exports = function(context) {
|
12
|
-
|
13
|
-
function check(node) {
|
14
|
-
var tokens = context.getFirstTokens(node, 2),
|
15
|
-
value = tokens[0].value;
|
16
|
-
|
17
|
-
if (tokens[0].range[1] >= tokens[1].range[0]) {
|
18
|
-
context.report(node, "Keyword \"" + value + "\" must be followed by whitespace.");
|
19
|
-
}
|
20
|
-
}
|
21
|
-
|
22
|
-
return {
|
23
|
-
"ReturnStatement": function(node) {
|
24
|
-
if (node.argument) {
|
25
|
-
check(node);
|
26
|
-
}
|
27
|
-
},
|
28
|
-
"SwitchCase": function(node) {
|
29
|
-
if (node.test) {
|
30
|
-
check(node);
|
31
|
-
}
|
32
|
-
},
|
33
|
-
"ThrowStatement": check
|
34
|
-
};
|
35
|
-
|
36
|
-
};
|
37
|
-
|
38
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Require spaces following return, throw, and case
|
3
|
+
* @author Michael Ficarra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
//------------------------------------------------------------------------------
|
8
|
+
// Rule Definition
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
|
11
|
+
module.exports = function(context) {
|
12
|
+
|
13
|
+
function check(node) {
|
14
|
+
var tokens = context.getFirstTokens(node, 2),
|
15
|
+
value = tokens[0].value;
|
16
|
+
|
17
|
+
if (tokens[0].range[1] >= tokens[1].range[0]) {
|
18
|
+
context.report(node, "Keyword \"" + value + "\" must be followed by whitespace.");
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
return {
|
23
|
+
"ReturnStatement": function(node) {
|
24
|
+
if (node.argument) {
|
25
|
+
check(node);
|
26
|
+
}
|
27
|
+
},
|
28
|
+
"SwitchCase": function(node) {
|
29
|
+
if (node.test) {
|
30
|
+
check(node);
|
31
|
+
}
|
32
|
+
},
|
33
|
+
"ThrowStatement": check
|
34
|
+
};
|
35
|
+
|
36
|
+
};
|
37
|
+
|
38
|
+
module.exports.schema = [];
|
@@ -1,133 +1,124 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview This rule shoud require or disallow spaces before or after unary operations.
|
3
|
-
* @author Marcin Kumorek
|
4
|
-
* @copyright 2014 Marcin Kumorek. All rights reserved.
|
5
|
-
*/
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
var options = context.options && Array.isArray(context.options) && context.options[0] || { words: true, nonwords: false };
|
14
|
-
|
15
|
-
//--------------------------------------------------------------------------
|
16
|
-
// Helpers
|
17
|
-
//--------------------------------------------------------------------------
|
18
|
-
|
19
|
-
/**
|
20
|
-
* Check if the parent unary operator is "!" in order to know if it's "!!" convert to Boolean or just "!" negation
|
21
|
-
* @param {ASTnode} node AST node
|
22
|
-
* @returns {boolean} Whether or not the parent is unary "!" operator
|
23
|
-
*/
|
24
|
-
function isParentUnaryBangExpression(node) {
|
25
|
-
return node && node.parent && node.parent.type === "UnaryExpression" && node.parent.operator === "!";
|
26
|
-
}
|
27
|
-
|
28
|
-
/**
|
29
|
-
*
|
30
|
-
* @param {
|
31
|
-
* @returns {boolean} Whether
|
32
|
-
*/
|
33
|
-
function
|
34
|
-
return
|
35
|
-
}
|
36
|
-
|
37
|
-
/**
|
38
|
-
* Check
|
39
|
-
* @param {ASTnode} node AST node
|
40
|
-
* @
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
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
|
-
"type": "boolean"
|
126
|
-
},
|
127
|
-
"nonwords": {
|
128
|
-
"type": "boolean"
|
129
|
-
}
|
130
|
-
},
|
131
|
-
"additionalProperties": false
|
132
|
-
}
|
133
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview This rule shoud require or disallow spaces before or after unary operations.
|
3
|
+
* @author Marcin Kumorek
|
4
|
+
* @copyright 2014 Marcin Kumorek. All rights reserved.
|
5
|
+
*/
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
var options = context.options && Array.isArray(context.options) && context.options[0] || { words: true, nonwords: false };
|
14
|
+
|
15
|
+
//--------------------------------------------------------------------------
|
16
|
+
// Helpers
|
17
|
+
//--------------------------------------------------------------------------
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Check if the parent unary operator is "!" in order to know if it's "!!" convert to Boolean or just "!" negation
|
21
|
+
* @param {ASTnode} node AST node
|
22
|
+
* @returns {boolean} Whether or not the parent is unary "!" operator
|
23
|
+
*/
|
24
|
+
function isParentUnaryBangExpression(node) {
|
25
|
+
return node && node.parent && node.parent.type === "UnaryExpression" && node.parent.operator === "!";
|
26
|
+
}
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Check if the node's child argument is an "ObjectExpression"
|
30
|
+
* @param {ASTnode} node AST node
|
31
|
+
* @returns {boolean} Whether or not the argument's type is "ObjectExpression"
|
32
|
+
*/
|
33
|
+
function isArgumentObjectExpression(node) {
|
34
|
+
return node.argument && node.argument.type && node.argument.type === "ObjectExpression";
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Check Unary Word Operators for spaces after the word operator
|
39
|
+
* @param {ASTnode} node AST node
|
40
|
+
* @param {object} firstToken first token from the AST node
|
41
|
+
* @param {object} secondToken second token from the AST node
|
42
|
+
* @returns {void}
|
43
|
+
*/
|
44
|
+
function checkUnaryWordOperatorForSpaces(node, firstToken, secondToken) {
|
45
|
+
if (options.words) {
|
46
|
+
if (secondToken.range[0] === firstToken.range[1]) {
|
47
|
+
context.report(node, "Unary word operator \"" + firstToken.value + "\" must be followed by whitespace.");
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
if (!options.words && isArgumentObjectExpression(node)) {
|
52
|
+
if (secondToken.range[0] > firstToken.range[1]) {
|
53
|
+
context.report(node, "Unexpected space after unary word operator \"" + firstToken.value + "\".");
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* Checks UnaryExpression, UpdateExpression and NewExpression for spaces before and after the operator
|
60
|
+
* @param {ASTnode} node AST node
|
61
|
+
* @returns {void}
|
62
|
+
*/
|
63
|
+
function checkForSpaces(node) {
|
64
|
+
var tokens = context.getFirstTokens(node, 2),
|
65
|
+
firstToken = tokens[0],
|
66
|
+
secondToken = tokens[1];
|
67
|
+
|
68
|
+
if ((node.type === "NewExpression" || node.prefix) && firstToken.type === "Keyword") {
|
69
|
+
checkUnaryWordOperatorForSpaces(node, firstToken, secondToken);
|
70
|
+
return void 0;
|
71
|
+
}
|
72
|
+
|
73
|
+
if (options.nonwords) {
|
74
|
+
if (node.prefix) {
|
75
|
+
if (isParentUnaryBangExpression(node)) {
|
76
|
+
return void 0;
|
77
|
+
}
|
78
|
+
if (firstToken.range[1] === secondToken.range[0]) {
|
79
|
+
context.report(node, "Unary operator \"" + firstToken.value + "\" must be followed by whitespace.");
|
80
|
+
}
|
81
|
+
} else {
|
82
|
+
if (firstToken.range[1] === secondToken.range[0]) {
|
83
|
+
context.report(node, "Space is required before unary expressions \"" + secondToken.value + "\".");
|
84
|
+
}
|
85
|
+
}
|
86
|
+
} else {
|
87
|
+
if (node.prefix) {
|
88
|
+
if (secondToken.range[0] > firstToken.range[1]) {
|
89
|
+
context.report(node, "Unexpected space after unary operator \"" + firstToken.value + "\".");
|
90
|
+
}
|
91
|
+
} else {
|
92
|
+
if (secondToken.range[0] > firstToken.range[1]) {
|
93
|
+
context.report(node, "Unexpected space before unary operator \"" + secondToken.value + "\".");
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
//--------------------------------------------------------------------------
|
100
|
+
// Public
|
101
|
+
//--------------------------------------------------------------------------
|
102
|
+
|
103
|
+
return {
|
104
|
+
"UnaryExpression": checkForSpaces,
|
105
|
+
"UpdateExpression": checkForSpaces,
|
106
|
+
"NewExpression": checkForSpaces
|
107
|
+
};
|
108
|
+
|
109
|
+
};
|
110
|
+
|
111
|
+
module.exports.schema = [
|
112
|
+
{
|
113
|
+
"type": "object",
|
114
|
+
"properties": {
|
115
|
+
"words": {
|
116
|
+
"type": "boolean"
|
117
|
+
},
|
118
|
+
"nonwords": {
|
119
|
+
"type": "boolean"
|
120
|
+
}
|
121
|
+
},
|
122
|
+
"additionalProperties": false
|
123
|
+
}
|
124
|
+
];
|