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,74 +1,74 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Disallow mixed spaces and tabs for indentation
|
3
|
-
* @author Jary Niebur
|
4
|
-
* @copyright 2014 Nicholas C. Zakas. All rights reserved.
|
5
|
-
* @copyright 2014 Jary Niebur. All rights reserved.
|
6
|
-
*/
|
7
|
-
"use strict";
|
8
|
-
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
// Rule Definition
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
|
13
|
-
module.exports = function(context) {
|
14
|
-
|
15
|
-
var smartTabs;
|
16
|
-
|
17
|
-
switch (context.options[0]) {
|
18
|
-
case true: // Support old syntax, maybe add deprecation warning here
|
19
|
-
case "smart-tabs":
|
20
|
-
smartTabs = true;
|
21
|
-
break;
|
22
|
-
default:
|
23
|
-
smartTabs = false;
|
24
|
-
}
|
25
|
-
|
26
|
-
var COMMENT_START = /^\s*\/\*/,
|
27
|
-
MAYBE_COMMENT = /^\s*\*/;
|
28
|
-
|
29
|
-
//--------------------------------------------------------------------------
|
30
|
-
// Public
|
31
|
-
//--------------------------------------------------------------------------
|
32
|
-
|
33
|
-
return {
|
34
|
-
|
35
|
-
"Program": function(node) {
|
36
|
-
/*
|
37
|
-
* At least one space followed by a tab
|
38
|
-
* or the reverse before non-tab/-space
|
39
|
-
* characters begin.
|
40
|
-
*/
|
41
|
-
var regex = /^(?=[\t ]*(\t | \t))/,
|
42
|
-
match,
|
43
|
-
lines = context.getSourceLines();
|
44
|
-
|
45
|
-
if (smartTabs) {
|
46
|
-
/*
|
47
|
-
* At least one space followed by a tab
|
48
|
-
* before non-tab/-space characters begin.
|
49
|
-
*/
|
50
|
-
regex = /^(?=[\t ]* \t)/;
|
51
|
-
}
|
52
|
-
|
53
|
-
lines.forEach(function(line, i) {
|
54
|
-
match = regex.exec(line);
|
55
|
-
|
56
|
-
if (match) {
|
57
|
-
|
58
|
-
if (!MAYBE_COMMENT.test(line) && !COMMENT_START.test(lines[i - 1])) {
|
59
|
-
context.report(node, { line: i + 1, column: match.index + 1 }, "Mixed spaces and tabs.");
|
60
|
-
}
|
61
|
-
|
62
|
-
}
|
63
|
-
});
|
64
|
-
}
|
65
|
-
|
66
|
-
};
|
67
|
-
|
68
|
-
};
|
69
|
-
|
70
|
-
module.exports.schema = [
|
71
|
-
{
|
72
|
-
"enum": ["smart-tabs", true, false]
|
73
|
-
}
|
74
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Disallow mixed spaces and tabs for indentation
|
3
|
+
* @author Jary Niebur
|
4
|
+
* @copyright 2014 Nicholas C. Zakas. All rights reserved.
|
5
|
+
* @copyright 2014 Jary Niebur. All rights reserved.
|
6
|
+
*/
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
// Rule Definition
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
module.exports = function(context) {
|
14
|
+
|
15
|
+
var smartTabs;
|
16
|
+
|
17
|
+
switch (context.options[0]) {
|
18
|
+
case true: // Support old syntax, maybe add deprecation warning here
|
19
|
+
case "smart-tabs":
|
20
|
+
smartTabs = true;
|
21
|
+
break;
|
22
|
+
default:
|
23
|
+
smartTabs = false;
|
24
|
+
}
|
25
|
+
|
26
|
+
var COMMENT_START = /^\s*\/\*/,
|
27
|
+
MAYBE_COMMENT = /^\s*\*/;
|
28
|
+
|
29
|
+
//--------------------------------------------------------------------------
|
30
|
+
// Public
|
31
|
+
//--------------------------------------------------------------------------
|
32
|
+
|
33
|
+
return {
|
34
|
+
|
35
|
+
"Program": function(node) {
|
36
|
+
/*
|
37
|
+
* At least one space followed by a tab
|
38
|
+
* or the reverse before non-tab/-space
|
39
|
+
* characters begin.
|
40
|
+
*/
|
41
|
+
var regex = /^(?=[\t ]*(\t | \t))/,
|
42
|
+
match,
|
43
|
+
lines = context.getSourceLines();
|
44
|
+
|
45
|
+
if (smartTabs) {
|
46
|
+
/*
|
47
|
+
* At least one space followed by a tab
|
48
|
+
* before non-tab/-space characters begin.
|
49
|
+
*/
|
50
|
+
regex = /^(?=[\t ]* \t)/;
|
51
|
+
}
|
52
|
+
|
53
|
+
lines.forEach(function(line, i) {
|
54
|
+
match = regex.exec(line);
|
55
|
+
|
56
|
+
if (match) {
|
57
|
+
|
58
|
+
if (!MAYBE_COMMENT.test(line) && !COMMENT_START.test(lines[i - 1])) {
|
59
|
+
context.report(node, { line: i + 1, column: match.index + 1 }, "Mixed spaces and tabs.");
|
60
|
+
}
|
61
|
+
|
62
|
+
}
|
63
|
+
});
|
64
|
+
}
|
65
|
+
|
66
|
+
};
|
67
|
+
|
68
|
+
};
|
69
|
+
|
70
|
+
module.exports.schema = [
|
71
|
+
{
|
72
|
+
"enum": ["smart-tabs", true, false]
|
73
|
+
}
|
74
|
+
];
|
@@ -1,119 +1,119 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Disallow use of multiple spaces.
|
3
|
-
* @author Nicholas C. Zakas
|
4
|
-
* @copyright 2015 Brandon Mills. All rights reserved.
|
5
|
-
* @copyright 2015 Nicholas C. Zakas. All rights reserved.
|
6
|
-
*/
|
7
|
-
|
8
|
-
"use strict";
|
9
|
-
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
// Rule Definition
|
12
|
-
//------------------------------------------------------------------------------
|
13
|
-
|
14
|
-
module.exports = function(context) {
|
15
|
-
|
16
|
-
// the index of the last comment that was checked
|
17
|
-
var exceptions = { "Property": true },
|
18
|
-
hasExceptions = true,
|
19
|
-
options = context.options[0],
|
20
|
-
lastCommentIndex = 0;
|
21
|
-
|
22
|
-
if (options && options.exceptions) {
|
23
|
-
Object.keys(options.exceptions).forEach(function (key) {
|
24
|
-
if (options.exceptions[key]) {
|
25
|
-
exceptions[key] = true;
|
26
|
-
} else {
|
27
|
-
delete exceptions[key];
|
28
|
-
}
|
29
|
-
});
|
30
|
-
hasExceptions = Object.keys(exceptions).length > 0;
|
31
|
-
}
|
32
|
-
|
33
|
-
/**
|
34
|
-
* Determines if a given source index is in a comment or not by checking
|
35
|
-
* the index against the comment range. Since the check goes straight
|
36
|
-
* through the file, once an index is passed a certain comment, we can
|
37
|
-
* go to the next comment to check that.
|
38
|
-
* @param {int} index The source index to check.
|
39
|
-
* @param {ASTNode[]} comments An array of comment nodes.
|
40
|
-
* @returns {boolean} True if the index is within a comment, false if not.
|
41
|
-
* @private
|
42
|
-
*/
|
43
|
-
function isIndexInComment(index, comments) {
|
44
|
-
|
45
|
-
var comment;
|
46
|
-
|
47
|
-
while (lastCommentIndex < comments.length) {
|
48
|
-
|
49
|
-
comment = comments[lastCommentIndex];
|
50
|
-
|
51
|
-
if (comment.range[0] <= index && index < comment.range[1]) {
|
52
|
-
return true;
|
53
|
-
} else if (index > comment.range[1]) {
|
54
|
-
lastCommentIndex++;
|
55
|
-
} else {
|
56
|
-
break;
|
57
|
-
}
|
58
|
-
|
59
|
-
}
|
60
|
-
|
61
|
-
return false;
|
62
|
-
}
|
63
|
-
|
64
|
-
//--------------------------------------------------------------------------
|
65
|
-
// Public
|
66
|
-
//--------------------------------------------------------------------------
|
67
|
-
|
68
|
-
return {
|
69
|
-
"Program": function() {
|
70
|
-
|
71
|
-
var source = context.getSource(),
|
72
|
-
allComments = context.getAllComments(),
|
73
|
-
pattern = /[^\n\r\u2028\u2029 ] {2,}/g, // note: repeating space
|
74
|
-
token,
|
75
|
-
parent;
|
76
|
-
|
77
|
-
while (pattern.test(source)) {
|
78
|
-
|
79
|
-
// do not flag anything inside of comments
|
80
|
-
if (!isIndexInComment(pattern.lastIndex, allComments)) {
|
81
|
-
|
82
|
-
token = context.getTokenByRangeStart(pattern.lastIndex);
|
83
|
-
|
84
|
-
if (token) {
|
85
|
-
if (hasExceptions) {
|
86
|
-
parent = context.getNodeByRangeIndex(pattern.lastIndex - 1);
|
87
|
-
}
|
88
|
-
|
89
|
-
if (!parent || !exceptions[parent.type]) {
|
90
|
-
context.report(token, token.loc.start,
|
91
|
-
"Multiple spaces found before '{{value}}'.",
|
92
|
-
{ value: token.value });
|
93
|
-
}
|
94
|
-
}
|
95
|
-
|
96
|
-
}
|
97
|
-
}
|
98
|
-
}
|
99
|
-
};
|
100
|
-
|
101
|
-
};
|
102
|
-
|
103
|
-
module.exports.schema = [
|
104
|
-
{
|
105
|
-
"type": "object",
|
106
|
-
"properties": {
|
107
|
-
"exceptions": {
|
108
|
-
"type": "object",
|
109
|
-
"patternProperties": {
|
110
|
-
"^([A-Z][a-z]*)+$": {
|
111
|
-
"type": "boolean"
|
112
|
-
}
|
113
|
-
},
|
114
|
-
"additionalProperties": false
|
115
|
-
}
|
116
|
-
},
|
117
|
-
"additionalProperties": false
|
118
|
-
}
|
119
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Disallow use of multiple spaces.
|
3
|
+
* @author Nicholas C. Zakas
|
4
|
+
* @copyright 2015 Brandon Mills. All rights reserved.
|
5
|
+
* @copyright 2015 Nicholas C. Zakas. All rights reserved.
|
6
|
+
*/
|
7
|
+
|
8
|
+
"use strict";
|
9
|
+
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
// Rule Definition
|
12
|
+
//------------------------------------------------------------------------------
|
13
|
+
|
14
|
+
module.exports = function(context) {
|
15
|
+
|
16
|
+
// the index of the last comment that was checked
|
17
|
+
var exceptions = { "Property": true },
|
18
|
+
hasExceptions = true,
|
19
|
+
options = context.options[0],
|
20
|
+
lastCommentIndex = 0;
|
21
|
+
|
22
|
+
if (options && options.exceptions) {
|
23
|
+
Object.keys(options.exceptions).forEach(function (key) {
|
24
|
+
if (options.exceptions[key]) {
|
25
|
+
exceptions[key] = true;
|
26
|
+
} else {
|
27
|
+
delete exceptions[key];
|
28
|
+
}
|
29
|
+
});
|
30
|
+
hasExceptions = Object.keys(exceptions).length > 0;
|
31
|
+
}
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Determines if a given source index is in a comment or not by checking
|
35
|
+
* the index against the comment range. Since the check goes straight
|
36
|
+
* through the file, once an index is passed a certain comment, we can
|
37
|
+
* go to the next comment to check that.
|
38
|
+
* @param {int} index The source index to check.
|
39
|
+
* @param {ASTNode[]} comments An array of comment nodes.
|
40
|
+
* @returns {boolean} True if the index is within a comment, false if not.
|
41
|
+
* @private
|
42
|
+
*/
|
43
|
+
function isIndexInComment(index, comments) {
|
44
|
+
|
45
|
+
var comment;
|
46
|
+
|
47
|
+
while (lastCommentIndex < comments.length) {
|
48
|
+
|
49
|
+
comment = comments[lastCommentIndex];
|
50
|
+
|
51
|
+
if (comment.range[0] <= index && index < comment.range[1]) {
|
52
|
+
return true;
|
53
|
+
} else if (index > comment.range[1]) {
|
54
|
+
lastCommentIndex++;
|
55
|
+
} else {
|
56
|
+
break;
|
57
|
+
}
|
58
|
+
|
59
|
+
}
|
60
|
+
|
61
|
+
return false;
|
62
|
+
}
|
63
|
+
|
64
|
+
//--------------------------------------------------------------------------
|
65
|
+
// Public
|
66
|
+
//--------------------------------------------------------------------------
|
67
|
+
|
68
|
+
return {
|
69
|
+
"Program": function() {
|
70
|
+
|
71
|
+
var source = context.getSource(),
|
72
|
+
allComments = context.getAllComments(),
|
73
|
+
pattern = /[^\n\r\u2028\u2029 ] {2,}/g, // note: repeating space
|
74
|
+
token,
|
75
|
+
parent;
|
76
|
+
|
77
|
+
while (pattern.test(source)) {
|
78
|
+
|
79
|
+
// do not flag anything inside of comments
|
80
|
+
if (!isIndexInComment(pattern.lastIndex, allComments)) {
|
81
|
+
|
82
|
+
token = context.getTokenByRangeStart(pattern.lastIndex);
|
83
|
+
|
84
|
+
if (token) {
|
85
|
+
if (hasExceptions) {
|
86
|
+
parent = context.getNodeByRangeIndex(pattern.lastIndex - 1);
|
87
|
+
}
|
88
|
+
|
89
|
+
if (!parent || !exceptions[parent.type]) {
|
90
|
+
context.report(token, token.loc.start,
|
91
|
+
"Multiple spaces found before '{{value}}'.",
|
92
|
+
{ value: token.value });
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
}
|
97
|
+
}
|
98
|
+
}
|
99
|
+
};
|
100
|
+
|
101
|
+
};
|
102
|
+
|
103
|
+
module.exports.schema = [
|
104
|
+
{
|
105
|
+
"type": "object",
|
106
|
+
"properties": {
|
107
|
+
"exceptions": {
|
108
|
+
"type": "object",
|
109
|
+
"patternProperties": {
|
110
|
+
"^([A-Z][a-z]*)+$": {
|
111
|
+
"type": "boolean"
|
112
|
+
}
|
113
|
+
},
|
114
|
+
"additionalProperties": false
|
115
|
+
}
|
116
|
+
},
|
117
|
+
"additionalProperties": false
|
118
|
+
}
|
119
|
+
];
|
@@ -1,43 +1,43 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag when using multiline strings
|
3
|
-
* @author Ilya Volodin
|
4
|
-
* @copyright 2014 Nicholas C. Zakas. All rights reserved.
|
5
|
-
* @copyright 2013 Ilya Volodin. All rights reserved.
|
6
|
-
*/
|
7
|
-
|
8
|
-
"use strict";
|
9
|
-
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
// Rule Definition
|
12
|
-
//------------------------------------------------------------------------------
|
13
|
-
|
14
|
-
module.exports = function(context) {
|
15
|
-
|
16
|
-
/**
|
17
|
-
* Determines if a given node is part of JSX syntax.
|
18
|
-
* @param {ASTNode} node The node to check.
|
19
|
-
* @returns {boolean} True if the node is a JSX node, false if not.
|
20
|
-
* @private
|
21
|
-
*/
|
22
|
-
function isJSXElement(node) {
|
23
|
-
return node.type.indexOf("JSX") === 0;
|
24
|
-
}
|
25
|
-
|
26
|
-
//--------------------------------------------------------------------------
|
27
|
-
// Public API
|
28
|
-
//--------------------------------------------------------------------------
|
29
|
-
|
30
|
-
return {
|
31
|
-
|
32
|
-
"Literal": function(node) {
|
33
|
-
var lineBreak = /\n/;
|
34
|
-
|
35
|
-
if (lineBreak.test(node.raw) && !isJSXElement(node.parent)) {
|
36
|
-
context.report(node, "Multiline support is limited to browsers supporting ES5 only.");
|
37
|
-
}
|
38
|
-
}
|
39
|
-
};
|
40
|
-
|
41
|
-
};
|
42
|
-
|
43
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag when using multiline strings
|
3
|
+
* @author Ilya Volodin
|
4
|
+
* @copyright 2014 Nicholas C. Zakas. All rights reserved.
|
5
|
+
* @copyright 2013 Ilya Volodin. All rights reserved.
|
6
|
+
*/
|
7
|
+
|
8
|
+
"use strict";
|
9
|
+
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
// Rule Definition
|
12
|
+
//------------------------------------------------------------------------------
|
13
|
+
|
14
|
+
module.exports = function(context) {
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Determines if a given node is part of JSX syntax.
|
18
|
+
* @param {ASTNode} node The node to check.
|
19
|
+
* @returns {boolean} True if the node is a JSX node, false if not.
|
20
|
+
* @private
|
21
|
+
*/
|
22
|
+
function isJSXElement(node) {
|
23
|
+
return node.type.indexOf("JSX") === 0;
|
24
|
+
}
|
25
|
+
|
26
|
+
//--------------------------------------------------------------------------
|
27
|
+
// Public API
|
28
|
+
//--------------------------------------------------------------------------
|
29
|
+
|
30
|
+
return {
|
31
|
+
|
32
|
+
"Literal": function(node) {
|
33
|
+
var lineBreak = /\n/;
|
34
|
+
|
35
|
+
if (lineBreak.test(node.raw) && !isJSXElement(node.parent)) {
|
36
|
+
context.report(node, "Multiline support is limited to browsers supporting ES5 only.");
|
37
|
+
}
|
38
|
+
}
|
39
|
+
};
|
40
|
+
|
41
|
+
};
|
42
|
+
|
43
|
+
module.exports.schema = [];
|
@@ -1,98 +1,98 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Disallows multiple blank lines.
|
3
|
-
* implementation adapted from the no-trailing-spaces rule.
|
4
|
-
* @author Greg Cochard
|
5
|
-
* @copyright 2014 Greg Cochard. All rights reserved.
|
6
|
-
*/
|
7
|
-
"use strict";
|
8
|
-
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
// Rule Definition
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
|
13
|
-
module.exports = function(context) {
|
14
|
-
|
15
|
-
// Use options.max or 2 as default
|
16
|
-
var numLines = 2;
|
17
|
-
|
18
|
-
// store lines that appear empty but really aren't
|
19
|
-
var notEmpty = [];
|
20
|
-
|
21
|
-
if (context.options.length) {
|
22
|
-
numLines = context.options[0].max;
|
23
|
-
}
|
24
|
-
|
25
|
-
//--------------------------------------------------------------------------
|
26
|
-
// Public
|
27
|
-
//--------------------------------------------------------------------------
|
28
|
-
|
29
|
-
return {
|
30
|
-
|
31
|
-
"TemplateLiteral": function(node) {
|
32
|
-
var start = node.loc.start.line;
|
33
|
-
var end = node.loc.end.line;
|
34
|
-
while (start <= end) {
|
35
|
-
notEmpty.push(start);
|
36
|
-
start++;
|
37
|
-
}
|
38
|
-
},
|
39
|
-
|
40
|
-
"Program:exit": function checkBlankLines(node) {
|
41
|
-
var lines = context.getSourceLines(),
|
42
|
-
currentLocation = -1,
|
43
|
-
lastLocation,
|
44
|
-
blankCounter = 0,
|
45
|
-
location,
|
46
|
-
trimmedLines = lines.map(function(str) {
|
47
|
-
return str.trim();
|
48
|
-
});
|
49
|
-
|
50
|
-
// add the notEmpty lines in there with a placeholder
|
51
|
-
notEmpty.forEach(function(x, i) {
|
52
|
-
trimmedLines[i] = x;
|
53
|
-
});
|
54
|
-
|
55
|
-
// swallow the final newline, as some editors add it automatically
|
56
|
-
// and we don't want it to cause an issue
|
57
|
-
if (trimmedLines[trimmedLines.length - 1] === "") {
|
58
|
-
trimmedLines = trimmedLines.slice(0, -1);
|
59
|
-
}
|
60
|
-
|
61
|
-
// Aggregate and count blank lines
|
62
|
-
lastLocation = currentLocation;
|
63
|
-
currentLocation = trimmedLines.indexOf("", currentLocation + 1);
|
64
|
-
while (currentLocation !== -1) {
|
65
|
-
lastLocation = currentLocation;
|
66
|
-
currentLocation = trimmedLines.indexOf("", currentLocation + 1);
|
67
|
-
if (lastLocation === currentLocation - 1) {
|
68
|
-
blankCounter++;
|
69
|
-
} else {
|
70
|
-
if (blankCounter >= numLines) {
|
71
|
-
location = {
|
72
|
-
line: lastLocation + 1,
|
73
|
-
column: lines[lastLocation].length
|
74
|
-
};
|
75
|
-
context.report(node, location, "Multiple blank lines not allowed.");
|
76
|
-
}
|
77
|
-
|
78
|
-
// Finally, reset the blank counter
|
79
|
-
blankCounter = 0;
|
80
|
-
}
|
81
|
-
}
|
82
|
-
}
|
83
|
-
};
|
84
|
-
|
85
|
-
};
|
86
|
-
|
87
|
-
module.exports.schema = [
|
88
|
-
{
|
89
|
-
"type": "object",
|
90
|
-
"properties": {
|
91
|
-
"max": {
|
92
|
-
"type": "integer"
|
93
|
-
}
|
94
|
-
},
|
95
|
-
"required": ["max"],
|
96
|
-
"additionalProperties": false
|
97
|
-
}
|
98
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Disallows multiple blank lines.
|
3
|
+
* implementation adapted from the no-trailing-spaces rule.
|
4
|
+
* @author Greg Cochard
|
5
|
+
* @copyright 2014 Greg Cochard. All rights reserved.
|
6
|
+
*/
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
// Rule Definition
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
module.exports = function(context) {
|
14
|
+
|
15
|
+
// Use options.max or 2 as default
|
16
|
+
var numLines = 2;
|
17
|
+
|
18
|
+
// store lines that appear empty but really aren't
|
19
|
+
var notEmpty = [];
|
20
|
+
|
21
|
+
if (context.options.length) {
|
22
|
+
numLines = context.options[0].max;
|
23
|
+
}
|
24
|
+
|
25
|
+
//--------------------------------------------------------------------------
|
26
|
+
// Public
|
27
|
+
//--------------------------------------------------------------------------
|
28
|
+
|
29
|
+
return {
|
30
|
+
|
31
|
+
"TemplateLiteral": function(node) {
|
32
|
+
var start = node.loc.start.line;
|
33
|
+
var end = node.loc.end.line;
|
34
|
+
while (start <= end) {
|
35
|
+
notEmpty.push(start);
|
36
|
+
start++;
|
37
|
+
}
|
38
|
+
},
|
39
|
+
|
40
|
+
"Program:exit": function checkBlankLines(node) {
|
41
|
+
var lines = context.getSourceLines(),
|
42
|
+
currentLocation = -1,
|
43
|
+
lastLocation,
|
44
|
+
blankCounter = 0,
|
45
|
+
location,
|
46
|
+
trimmedLines = lines.map(function(str) {
|
47
|
+
return str.trim();
|
48
|
+
});
|
49
|
+
|
50
|
+
// add the notEmpty lines in there with a placeholder
|
51
|
+
notEmpty.forEach(function(x, i) {
|
52
|
+
trimmedLines[i] = x;
|
53
|
+
});
|
54
|
+
|
55
|
+
// swallow the final newline, as some editors add it automatically
|
56
|
+
// and we don't want it to cause an issue
|
57
|
+
if (trimmedLines[trimmedLines.length - 1] === "") {
|
58
|
+
trimmedLines = trimmedLines.slice(0, -1);
|
59
|
+
}
|
60
|
+
|
61
|
+
// Aggregate and count blank lines
|
62
|
+
lastLocation = currentLocation;
|
63
|
+
currentLocation = trimmedLines.indexOf("", currentLocation + 1);
|
64
|
+
while (currentLocation !== -1) {
|
65
|
+
lastLocation = currentLocation;
|
66
|
+
currentLocation = trimmedLines.indexOf("", currentLocation + 1);
|
67
|
+
if (lastLocation === currentLocation - 1) {
|
68
|
+
blankCounter++;
|
69
|
+
} else {
|
70
|
+
if (blankCounter >= numLines) {
|
71
|
+
location = {
|
72
|
+
line: lastLocation + 1,
|
73
|
+
column: lines[lastLocation].length
|
74
|
+
};
|
75
|
+
context.report(node, location, "Multiple blank lines not allowed.");
|
76
|
+
}
|
77
|
+
|
78
|
+
// Finally, reset the blank counter
|
79
|
+
blankCounter = 0;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
};
|
84
|
+
|
85
|
+
};
|
86
|
+
|
87
|
+
module.exports.schema = [
|
88
|
+
{
|
89
|
+
"type": "object",
|
90
|
+
"properties": {
|
91
|
+
"max": {
|
92
|
+
"type": "integer"
|
93
|
+
}
|
94
|
+
},
|
95
|
+
"required": ["max"],
|
96
|
+
"additionalProperties": false
|
97
|
+
}
|
98
|
+
];
|