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,53 +1,53 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Validate strings passed to the RegExp constructor
|
3
|
-
* @author Michael Ficarra
|
4
|
-
* @copyright 2014 Michael Ficarra. All rights reserved.
|
5
|
-
*/
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Requirements
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
var espree = require("espree");
|
13
|
-
|
14
|
-
//------------------------------------------------------------------------------
|
15
|
-
// Rule Definition
|
16
|
-
//------------------------------------------------------------------------------
|
17
|
-
|
18
|
-
module.exports = function(context) {
|
19
|
-
|
20
|
-
function isString(node) {
|
21
|
-
return node && node.type === "Literal" && typeof node.value === "string";
|
22
|
-
}
|
23
|
-
|
24
|
-
function check(node) {
|
25
|
-
if (node.callee.type === "Identifier" && node.callee.name === "RegExp" && isString(node.arguments[0])) {
|
26
|
-
var flags = isString(node.arguments[1]) ? node.arguments[1].value : "";
|
27
|
-
|
28
|
-
try {
|
29
|
-
void new RegExp(node.arguments[0].value);
|
30
|
-
} catch(e) {
|
31
|
-
context.report(node, e.message);
|
32
|
-
}
|
33
|
-
|
34
|
-
if (flags) {
|
35
|
-
|
36
|
-
try {
|
37
|
-
espree.parse("/./" + flags, { ecmaFeatures: context.ecmaFeatures });
|
38
|
-
} catch (ex) {
|
39
|
-
context.report(node, "Invalid flags supplied to RegExp constructor '" + flags + "'");
|
40
|
-
}
|
41
|
-
}
|
42
|
-
|
43
|
-
}
|
44
|
-
}
|
45
|
-
|
46
|
-
return {
|
47
|
-
"CallExpression": check,
|
48
|
-
"NewExpression": check
|
49
|
-
};
|
50
|
-
|
51
|
-
};
|
52
|
-
|
53
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Validate strings passed to the RegExp constructor
|
3
|
+
* @author Michael Ficarra
|
4
|
+
* @copyright 2014 Michael Ficarra. All rights reserved.
|
5
|
+
*/
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Requirements
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
var espree = require("espree");
|
13
|
+
|
14
|
+
//------------------------------------------------------------------------------
|
15
|
+
// Rule Definition
|
16
|
+
//------------------------------------------------------------------------------
|
17
|
+
|
18
|
+
module.exports = function(context) {
|
19
|
+
|
20
|
+
function isString(node) {
|
21
|
+
return node && node.type === "Literal" && typeof node.value === "string";
|
22
|
+
}
|
23
|
+
|
24
|
+
function check(node) {
|
25
|
+
if (node.callee.type === "Identifier" && node.callee.name === "RegExp" && isString(node.arguments[0])) {
|
26
|
+
var flags = isString(node.arguments[1]) ? node.arguments[1].value : "";
|
27
|
+
|
28
|
+
try {
|
29
|
+
void new RegExp(node.arguments[0].value);
|
30
|
+
} catch(e) {
|
31
|
+
context.report(node, e.message);
|
32
|
+
}
|
33
|
+
|
34
|
+
if (flags) {
|
35
|
+
|
36
|
+
try {
|
37
|
+
espree.parse("/./" + flags, { ecmaFeatures: context.ecmaFeatures });
|
38
|
+
} catch (ex) {
|
39
|
+
context.report(node, "Invalid flags supplied to RegExp constructor '" + flags + "'");
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
return {
|
47
|
+
"CallExpression": check,
|
48
|
+
"NewExpression": check
|
49
|
+
};
|
50
|
+
|
51
|
+
};
|
52
|
+
|
53
|
+
module.exports.schema = [];
|
@@ -1,135 +1,135 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to disalow whitespace that is not a tab or space, whitespace inside strings and comments are allowed
|
3
|
-
* @author Jonathan Kingston
|
4
|
-
* @copyright 2014 Jonathan Kingston. All rights reserved.
|
5
|
-
*/
|
6
|
-
|
7
|
-
"use strict";
|
8
|
-
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
// Rule Definition
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
|
13
|
-
module.exports = function(context) {
|
14
|
-
|
15
|
-
var irregularWhitespace = /[\u0085\u00A0\ufeff\f\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u202f\u205f\u3000]+/mg,
|
16
|
-
irregularLineTerminators = /[\u2028\u2029]/mg;
|
17
|
-
|
18
|
-
// Module store of errors that we have found
|
19
|
-
var errors = [];
|
20
|
-
|
21
|
-
/**
|
22
|
-
* Removes errors that occur inside a string node
|
23
|
-
* @param {ASTNode} node to check for matching errors.
|
24
|
-
* @returns {void}
|
25
|
-
* @private
|
26
|
-
*/
|
27
|
-
function removeStringError(node) {
|
28
|
-
var locStart = node.loc.start;
|
29
|
-
var locEnd = node.loc.end;
|
30
|
-
|
31
|
-
errors = errors.filter(function (error) {
|
32
|
-
var errorLoc = error[1];
|
33
|
-
if (errorLoc.line >= locStart.line && errorLoc.line <= locEnd.line) {
|
34
|
-
if (errorLoc.column >= locStart.column && (errorLoc.column <= locEnd.column || errorLoc.line < locEnd.line)) {
|
35
|
-
return false;
|
36
|
-
}
|
37
|
-
}
|
38
|
-
return true;
|
39
|
-
});
|
40
|
-
}
|
41
|
-
|
42
|
-
/**
|
43
|
-
* Checks nodes for errors that we are choosing to ignore and calls the relevant methods to remove the errors
|
44
|
-
* @param {ASTNode} node to check for matching errors.
|
45
|
-
* @returns {void}
|
46
|
-
* @private
|
47
|
-
*/
|
48
|
-
function removeInvalidNodeErrors(node) {
|
49
|
-
if (typeof node.value === "string") {
|
50
|
-
// If we have irregular characters remove them from the errors list
|
51
|
-
if (node.raw.match(irregularWhitespace) || node.raw.match(irregularLineTerminators)) {
|
52
|
-
removeStringError(node);
|
53
|
-
}
|
54
|
-
}
|
55
|
-
}
|
56
|
-
|
57
|
-
/**
|
58
|
-
* Checks the program source for irregular whitespace
|
59
|
-
* @param {ASTNode} node The program node
|
60
|
-
* @returns {void}
|
61
|
-
* @private
|
62
|
-
*/
|
63
|
-
function checkForIrregularWhitespace(node) {
|
64
|
-
var sourceLines = context.getSourceLines();
|
65
|
-
|
66
|
-
sourceLines.forEach(function (sourceLine, lineIndex) {
|
67
|
-
var lineNumber = lineIndex + 1,
|
68
|
-
location,
|
69
|
-
match;
|
70
|
-
|
71
|
-
while ((match = irregularWhitespace.exec(sourceLine)) !== null) {
|
72
|
-
location = {
|
73
|
-
line: lineNumber,
|
74
|
-
column: match.index
|
75
|
-
};
|
76
|
-
|
77
|
-
errors.push([node, location, "Irregular whitespace not allowed"]);
|
78
|
-
}
|
79
|
-
});
|
80
|
-
}
|
81
|
-
|
82
|
-
/**
|
83
|
-
* Checks the program source for irregular line terminators
|
84
|
-
* @param {ASTNode} node The program node
|
85
|
-
* @returns {void}
|
86
|
-
* @private
|
87
|
-
*/
|
88
|
-
function checkForIrregularLineTerminators(node) {
|
89
|
-
var source = context.getSource(),
|
90
|
-
sourceLines = context.getSourceLines(),
|
91
|
-
linebreaks = source.match(/\r\n|\r|\n|\u2028|\u2029/g),
|
92
|
-
lastLineIndex = -1,
|
93
|
-
lineIndex,
|
94
|
-
location,
|
95
|
-
match;
|
96
|
-
|
97
|
-
while ((match = irregularLineTerminators.exec(source)) !== null) {
|
98
|
-
lineIndex = linebreaks.indexOf(match[0], lastLineIndex + 1) || 0;
|
99
|
-
|
100
|
-
location = {
|
101
|
-
line: lineIndex + 1,
|
102
|
-
column: sourceLines[lineIndex].length
|
103
|
-
};
|
104
|
-
|
105
|
-
errors.push([node, location, "Irregular whitespace not allowed"]);
|
106
|
-
lastLineIndex = lineIndex;
|
107
|
-
}
|
108
|
-
}
|
109
|
-
|
110
|
-
return {
|
111
|
-
"Program": function (node) {
|
112
|
-
/**
|
113
|
-
* As we can easily fire warnings for all white space issues with all the source its simpler to fire them here
|
114
|
-
* This means we can check all the application code without having to worry about issues caused in the parser tokens
|
115
|
-
* When writing this code also evaluating per node was missing out connecting tokens in some cases
|
116
|
-
* We can later filter the errors when they are found to be not an issue in nodes we don't care about
|
117
|
-
*/
|
118
|
-
|
119
|
-
checkForIrregularWhitespace(node);
|
120
|
-
checkForIrregularLineTerminators(node);
|
121
|
-
},
|
122
|
-
|
123
|
-
"Identifier": removeInvalidNodeErrors,
|
124
|
-
"Literal": removeInvalidNodeErrors,
|
125
|
-
"Program:exit": function () {
|
126
|
-
|
127
|
-
// If we have any errors remaining report on them
|
128
|
-
errors.forEach(function (error) {
|
129
|
-
context.report.apply(this, error);
|
130
|
-
});
|
131
|
-
}
|
132
|
-
};
|
133
|
-
};
|
134
|
-
|
135
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to disalow whitespace that is not a tab or space, whitespace inside strings and comments are allowed
|
3
|
+
* @author Jonathan Kingston
|
4
|
+
* @copyright 2014 Jonathan Kingston. All rights reserved.
|
5
|
+
*/
|
6
|
+
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
// Rule Definition
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
module.exports = function(context) {
|
14
|
+
|
15
|
+
var irregularWhitespace = /[\u0085\u00A0\ufeff\f\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u202f\u205f\u3000]+/mg,
|
16
|
+
irregularLineTerminators = /[\u2028\u2029]/mg;
|
17
|
+
|
18
|
+
// Module store of errors that we have found
|
19
|
+
var errors = [];
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Removes errors that occur inside a string node
|
23
|
+
* @param {ASTNode} node to check for matching errors.
|
24
|
+
* @returns {void}
|
25
|
+
* @private
|
26
|
+
*/
|
27
|
+
function removeStringError(node) {
|
28
|
+
var locStart = node.loc.start;
|
29
|
+
var locEnd = node.loc.end;
|
30
|
+
|
31
|
+
errors = errors.filter(function (error) {
|
32
|
+
var errorLoc = error[1];
|
33
|
+
if (errorLoc.line >= locStart.line && errorLoc.line <= locEnd.line) {
|
34
|
+
if (errorLoc.column >= locStart.column && (errorLoc.column <= locEnd.column || errorLoc.line < locEnd.line)) {
|
35
|
+
return false;
|
36
|
+
}
|
37
|
+
}
|
38
|
+
return true;
|
39
|
+
});
|
40
|
+
}
|
41
|
+
|
42
|
+
/**
|
43
|
+
* Checks nodes for errors that we are choosing to ignore and calls the relevant methods to remove the errors
|
44
|
+
* @param {ASTNode} node to check for matching errors.
|
45
|
+
* @returns {void}
|
46
|
+
* @private
|
47
|
+
*/
|
48
|
+
function removeInvalidNodeErrors(node) {
|
49
|
+
if (typeof node.value === "string") {
|
50
|
+
// If we have irregular characters remove them from the errors list
|
51
|
+
if (node.raw.match(irregularWhitespace) || node.raw.match(irregularLineTerminators)) {
|
52
|
+
removeStringError(node);
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
/**
|
58
|
+
* Checks the program source for irregular whitespace
|
59
|
+
* @param {ASTNode} node The program node
|
60
|
+
* @returns {void}
|
61
|
+
* @private
|
62
|
+
*/
|
63
|
+
function checkForIrregularWhitespace(node) {
|
64
|
+
var sourceLines = context.getSourceLines();
|
65
|
+
|
66
|
+
sourceLines.forEach(function (sourceLine, lineIndex) {
|
67
|
+
var lineNumber = lineIndex + 1,
|
68
|
+
location,
|
69
|
+
match;
|
70
|
+
|
71
|
+
while ((match = irregularWhitespace.exec(sourceLine)) !== null) {
|
72
|
+
location = {
|
73
|
+
line: lineNumber,
|
74
|
+
column: match.index
|
75
|
+
};
|
76
|
+
|
77
|
+
errors.push([node, location, "Irregular whitespace not allowed"]);
|
78
|
+
}
|
79
|
+
});
|
80
|
+
}
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Checks the program source for irregular line terminators
|
84
|
+
* @param {ASTNode} node The program node
|
85
|
+
* @returns {void}
|
86
|
+
* @private
|
87
|
+
*/
|
88
|
+
function checkForIrregularLineTerminators(node) {
|
89
|
+
var source = context.getSource(),
|
90
|
+
sourceLines = context.getSourceLines(),
|
91
|
+
linebreaks = source.match(/\r\n|\r|\n|\u2028|\u2029/g),
|
92
|
+
lastLineIndex = -1,
|
93
|
+
lineIndex,
|
94
|
+
location,
|
95
|
+
match;
|
96
|
+
|
97
|
+
while ((match = irregularLineTerminators.exec(source)) !== null) {
|
98
|
+
lineIndex = linebreaks.indexOf(match[0], lastLineIndex + 1) || 0;
|
99
|
+
|
100
|
+
location = {
|
101
|
+
line: lineIndex + 1,
|
102
|
+
column: sourceLines[lineIndex].length
|
103
|
+
};
|
104
|
+
|
105
|
+
errors.push([node, location, "Irregular whitespace not allowed"]);
|
106
|
+
lastLineIndex = lineIndex;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
return {
|
111
|
+
"Program": function (node) {
|
112
|
+
/**
|
113
|
+
* As we can easily fire warnings for all white space issues with all the source its simpler to fire them here
|
114
|
+
* This means we can check all the application code without having to worry about issues caused in the parser tokens
|
115
|
+
* When writing this code also evaluating per node was missing out connecting tokens in some cases
|
116
|
+
* We can later filter the errors when they are found to be not an issue in nodes we don't care about
|
117
|
+
*/
|
118
|
+
|
119
|
+
checkForIrregularWhitespace(node);
|
120
|
+
checkForIrregularLineTerminators(node);
|
121
|
+
},
|
122
|
+
|
123
|
+
"Identifier": removeInvalidNodeErrors,
|
124
|
+
"Literal": removeInvalidNodeErrors,
|
125
|
+
"Program:exit": function () {
|
126
|
+
|
127
|
+
// If we have any errors remaining report on them
|
128
|
+
errors.forEach(function (error) {
|
129
|
+
context.report.apply(this, error);
|
130
|
+
});
|
131
|
+
}
|
132
|
+
};
|
133
|
+
};
|
134
|
+
|
135
|
+
module.exports.schema = [];
|
package/lib/rules/no-iterator.js
CHANGED
@@ -1,28 +1,28 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag usage of __iterator__ property
|
3
|
-
* @author Ian Christian Myers
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
return {
|
15
|
-
|
16
|
-
"MemberExpression": function(node) {
|
17
|
-
|
18
|
-
if (node.property &&
|
19
|
-
(node.property.type === "Identifier" && node.property.name === "__iterator__" && !node.computed) ||
|
20
|
-
(node.property.type === "Literal" && node.property.value === "__iterator__")) {
|
21
|
-
context.report(node, "Reserved name '__iterator__'.");
|
22
|
-
}
|
23
|
-
}
|
24
|
-
};
|
25
|
-
|
26
|
-
};
|
27
|
-
|
28
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag usage of __iterator__ property
|
3
|
+
* @author Ian Christian Myers
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
return {
|
15
|
+
|
16
|
+
"MemberExpression": function(node) {
|
17
|
+
|
18
|
+
if (node.property &&
|
19
|
+
(node.property.type === "Identifier" && node.property.name === "__iterator__" && !node.computed) ||
|
20
|
+
(node.property.type === "Literal" && node.property.value === "__iterator__")) {
|
21
|
+
context.report(node, "Reserved name '__iterator__'.");
|
22
|
+
}
|
23
|
+
}
|
24
|
+
};
|
25
|
+
|
26
|
+
};
|
27
|
+
|
28
|
+
module.exports.schema = [];
|
@@ -1,64 +1,64 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag labels that are the same as an identifier
|
3
|
-
* @author Ian Christian Myers
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
//--------------------------------------------------------------------------
|
15
|
-
// Helpers
|
16
|
-
//--------------------------------------------------------------------------
|
17
|
-
|
18
|
-
function findIdentifier(scope, identifier) {
|
19
|
-
var found = false;
|
20
|
-
|
21
|
-
scope.variables.forEach(function(variable) {
|
22
|
-
if (variable.name === identifier) {
|
23
|
-
found = true;
|
24
|
-
}
|
25
|
-
});
|
26
|
-
|
27
|
-
scope.references.forEach(function(reference) {
|
28
|
-
if (reference.identifier.name === identifier) {
|
29
|
-
found = true;
|
30
|
-
}
|
31
|
-
});
|
32
|
-
|
33
|
-
// If we have not found the identifier in this scope, check the parent
|
34
|
-
// scope.
|
35
|
-
if (scope.upper && !found) {
|
36
|
-
return findIdentifier(scope.upper, identifier);
|
37
|
-
}
|
38
|
-
|
39
|
-
return found;
|
40
|
-
}
|
41
|
-
|
42
|
-
//--------------------------------------------------------------------------
|
43
|
-
// Public API
|
44
|
-
//--------------------------------------------------------------------------
|
45
|
-
|
46
|
-
return {
|
47
|
-
|
48
|
-
"LabeledStatement": function(node) {
|
49
|
-
|
50
|
-
// Fetch the innermost scope.
|
51
|
-
var scope = context.getScope();
|
52
|
-
|
53
|
-
// Recursively find the identifier walking up the scope, starting
|
54
|
-
// with the innermost scope.
|
55
|
-
if (findIdentifier(scope, node.label.name)) {
|
56
|
-
context.report(node, "Found identifier with same name as label.");
|
57
|
-
}
|
58
|
-
}
|
59
|
-
|
60
|
-
};
|
61
|
-
|
62
|
-
};
|
63
|
-
|
64
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag labels that are the same as an identifier
|
3
|
+
* @author Ian Christian Myers
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
//--------------------------------------------------------------------------
|
15
|
+
// Helpers
|
16
|
+
//--------------------------------------------------------------------------
|
17
|
+
|
18
|
+
function findIdentifier(scope, identifier) {
|
19
|
+
var found = false;
|
20
|
+
|
21
|
+
scope.variables.forEach(function(variable) {
|
22
|
+
if (variable.name === identifier) {
|
23
|
+
found = true;
|
24
|
+
}
|
25
|
+
});
|
26
|
+
|
27
|
+
scope.references.forEach(function(reference) {
|
28
|
+
if (reference.identifier.name === identifier) {
|
29
|
+
found = true;
|
30
|
+
}
|
31
|
+
});
|
32
|
+
|
33
|
+
// If we have not found the identifier in this scope, check the parent
|
34
|
+
// scope.
|
35
|
+
if (scope.upper && !found) {
|
36
|
+
return findIdentifier(scope.upper, identifier);
|
37
|
+
}
|
38
|
+
|
39
|
+
return found;
|
40
|
+
}
|
41
|
+
|
42
|
+
//--------------------------------------------------------------------------
|
43
|
+
// Public API
|
44
|
+
//--------------------------------------------------------------------------
|
45
|
+
|
46
|
+
return {
|
47
|
+
|
48
|
+
"LabeledStatement": function(node) {
|
49
|
+
|
50
|
+
// Fetch the innermost scope.
|
51
|
+
var scope = context.getScope();
|
52
|
+
|
53
|
+
// Recursively find the identifier walking up the scope, starting
|
54
|
+
// with the innermost scope.
|
55
|
+
if (findIdentifier(scope, node.label.name)) {
|
56
|
+
context.report(node, "Found identifier with same name as label.");
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
};
|
61
|
+
|
62
|
+
};
|
63
|
+
|
64
|
+
module.exports.schema = [];
|
package/lib/rules/no-labels.js
CHANGED
@@ -1,44 +1,44 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Disallow Labeled Statements
|
3
|
-
* @author Nicholas C. Zakas
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
//------------------------------------------------------------------------------
|
8
|
-
// Rule Definition
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
|
11
|
-
module.exports = function(context) {
|
12
|
-
|
13
|
-
//--------------------------------------------------------------------------
|
14
|
-
// Public
|
15
|
-
//--------------------------------------------------------------------------
|
16
|
-
|
17
|
-
return {
|
18
|
-
|
19
|
-
"LabeledStatement": function(node) {
|
20
|
-
context.report(node, "Unexpected labeled statement.");
|
21
|
-
},
|
22
|
-
|
23
|
-
"BreakStatement": function(node) {
|
24
|
-
|
25
|
-
if (node.label) {
|
26
|
-
context.report(node, "Unexpected label in break statement.");
|
27
|
-
}
|
28
|
-
|
29
|
-
},
|
30
|
-
|
31
|
-
"ContinueStatement": function(node) {
|
32
|
-
|
33
|
-
if (node.label) {
|
34
|
-
context.report(node, "Unexpected label in continue statement.");
|
35
|
-
}
|
36
|
-
|
37
|
-
}
|
38
|
-
|
39
|
-
|
40
|
-
};
|
41
|
-
|
42
|
-
};
|
43
|
-
|
44
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Disallow Labeled Statements
|
3
|
+
* @author Nicholas C. Zakas
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
//------------------------------------------------------------------------------
|
8
|
+
// Rule Definition
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
|
11
|
+
module.exports = function(context) {
|
12
|
+
|
13
|
+
//--------------------------------------------------------------------------
|
14
|
+
// Public
|
15
|
+
//--------------------------------------------------------------------------
|
16
|
+
|
17
|
+
return {
|
18
|
+
|
19
|
+
"LabeledStatement": function(node) {
|
20
|
+
context.report(node, "Unexpected labeled statement.");
|
21
|
+
},
|
22
|
+
|
23
|
+
"BreakStatement": function(node) {
|
24
|
+
|
25
|
+
if (node.label) {
|
26
|
+
context.report(node, "Unexpected label in break statement.");
|
27
|
+
}
|
28
|
+
|
29
|
+
},
|
30
|
+
|
31
|
+
"ContinueStatement": function(node) {
|
32
|
+
|
33
|
+
if (node.label) {
|
34
|
+
context.report(node, "Unexpected label in continue statement.");
|
35
|
+
}
|
36
|
+
|
37
|
+
}
|
38
|
+
|
39
|
+
|
40
|
+
};
|
41
|
+
|
42
|
+
};
|
43
|
+
|
44
|
+
module.exports.schema = [];
|