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
@@ -0,0 +1,91 @@
|
|
1
|
+
/**
|
2
|
+
* @fileoverview A rule to suggest using of const declaration for variables that are never modified after declared.
|
3
|
+
* @author Toru Nagashima
|
4
|
+
* @copyright 2015 Toru Nagashima. All rights reserved.
|
5
|
+
*/
|
6
|
+
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
// Rule Definition
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
module.exports = function(context) {
|
14
|
+
|
15
|
+
/**
|
16
|
+
* Checks whether a reference is the initializer.
|
17
|
+
* @param {Reference} reference - A reference to check.
|
18
|
+
* @returns {boolean} Whether or not the reference is the initializer.
|
19
|
+
*/
|
20
|
+
function isInitializer(reference) {
|
21
|
+
return reference.init === true;
|
22
|
+
}
|
23
|
+
|
24
|
+
/**
|
25
|
+
* Checks whether a reference is read-only or the initializer.
|
26
|
+
* @param {Reference} reference - A reference to check.
|
27
|
+
* @returns {boolean} Whether or not the reference is read-only or the initializer.
|
28
|
+
*/
|
29
|
+
function isReadOnlyOrInitializer(reference) {
|
30
|
+
return reference.isReadOnly() || reference.init === true;
|
31
|
+
}
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Searches and reports variables that are never modified after declared.
|
35
|
+
* @param {Scope} scope - A scope of the search domain.
|
36
|
+
* @returns {void}
|
37
|
+
*/
|
38
|
+
function checkForVariables(scope) {
|
39
|
+
// Skip the TDZ type.
|
40
|
+
if (scope.type === "TDZ") {
|
41
|
+
return;
|
42
|
+
}
|
43
|
+
|
44
|
+
var variables = scope.variables;
|
45
|
+
for (var i = 0, end = variables.length; i < end; ++i) {
|
46
|
+
var variable = variables[i];
|
47
|
+
var def = variable.defs[0];
|
48
|
+
var declaration = def && def.parent;
|
49
|
+
var statement = declaration && declaration.parent;
|
50
|
+
var references = variable.references;
|
51
|
+
var identifier = variable.identifiers[0];
|
52
|
+
|
53
|
+
if (statement != null &&
|
54
|
+
identifier != null &&
|
55
|
+
declaration.type === "VariableDeclaration" &&
|
56
|
+
declaration.kind === "let" &&
|
57
|
+
(statement.type !== "ForStatement" || statement.init !== declaration) &&
|
58
|
+
references.some(isInitializer) &&
|
59
|
+
references.every(isReadOnlyOrInitializer)
|
60
|
+
) {
|
61
|
+
context.report(
|
62
|
+
identifier,
|
63
|
+
"`{{name}}` is never modified, use `const` instead.",
|
64
|
+
{name: identifier.name});
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
/**
|
70
|
+
* Adds multiple items to the tail of an array.
|
71
|
+
* @param {any[]} array - A destination to add.
|
72
|
+
* @param {any[]} values - Items to be added.
|
73
|
+
* @returns {void}
|
74
|
+
*/
|
75
|
+
var pushAll = Function.apply.bind(Array.prototype.push);
|
76
|
+
|
77
|
+
return {
|
78
|
+
"Program:exit": function () {
|
79
|
+
var stack = [context.getScope()];
|
80
|
+
while (stack.length) {
|
81
|
+
var scope = stack.pop();
|
82
|
+
pushAll(stack, scope.childScopes);
|
83
|
+
|
84
|
+
checkForVariables(scope);
|
85
|
+
}
|
86
|
+
}
|
87
|
+
};
|
88
|
+
|
89
|
+
};
|
90
|
+
|
91
|
+
module.exports.schema = [];
|
package/lib/rules/quote-props.js
CHANGED
@@ -1,72 +1,72 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag non-quoted property names in object literals.
|
3
|
-
* @author Mathias Bynens <http://mathiasbynens.be/>
|
4
|
-
* @copyright 2014 Brandon Mills. 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
|
-
var MODE = context.options[0];
|
21
|
-
|
22
|
-
/**
|
23
|
-
* Ensures that a property's key is quoted only when necessary
|
24
|
-
* @param {ASTNode} node Property AST node
|
25
|
-
* @returns {void}
|
26
|
-
*/
|
27
|
-
function asNeeded(node) {
|
28
|
-
var key = node.key,
|
29
|
-
tokens;
|
30
|
-
|
31
|
-
if (key.type === "Literal" && typeof key.value === "string") {
|
32
|
-
try {
|
33
|
-
tokens = espree.tokenize(key.value);
|
34
|
-
} catch (e) {
|
35
|
-
return;
|
36
|
-
}
|
37
|
-
|
38
|
-
if (tokens.length === 1 &&
|
39
|
-
(["Identifier", "Null", "Boolean"].indexOf(tokens[0].type) >= 0 ||
|
40
|
-
(tokens[0].type === "Numeric" && "" + +tokens[0].value === tokens[0].value))
|
41
|
-
) {
|
42
|
-
context.report(node, "Unnecessarily quoted property `{{value}}` found.", key);
|
43
|
-
}
|
44
|
-
}
|
45
|
-
}
|
46
|
-
|
47
|
-
/**
|
48
|
-
* Ensures that a property's key is quoted
|
49
|
-
* @param {ASTNode} node Property AST node
|
50
|
-
* @returns {void}
|
51
|
-
*/
|
52
|
-
function always(node) {
|
53
|
-
var key = node.key;
|
54
|
-
|
55
|
-
if (!node.method && !(key.type === "Literal" && typeof key.value === "string")) {
|
56
|
-
context.report(node, "Unquoted property `{{key}}` found.", {
|
57
|
-
key: key.name || key.value
|
58
|
-
});
|
59
|
-
}
|
60
|
-
}
|
61
|
-
|
62
|
-
return {
|
63
|
-
"Property": MODE === "as-needed" ? asNeeded : always
|
64
|
-
};
|
65
|
-
|
66
|
-
};
|
67
|
-
|
68
|
-
module.exports.schema = [
|
69
|
-
{
|
70
|
-
"enum": ["always", "as-needed"]
|
71
|
-
}
|
72
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag non-quoted property names in object literals.
|
3
|
+
* @author Mathias Bynens <http://mathiasbynens.be/>
|
4
|
+
* @copyright 2014 Brandon Mills. 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
|
+
var MODE = context.options[0];
|
21
|
+
|
22
|
+
/**
|
23
|
+
* Ensures that a property's key is quoted only when necessary
|
24
|
+
* @param {ASTNode} node Property AST node
|
25
|
+
* @returns {void}
|
26
|
+
*/
|
27
|
+
function asNeeded(node) {
|
28
|
+
var key = node.key,
|
29
|
+
tokens;
|
30
|
+
|
31
|
+
if (key.type === "Literal" && typeof key.value === "string") {
|
32
|
+
try {
|
33
|
+
tokens = espree.tokenize(key.value);
|
34
|
+
} catch (e) {
|
35
|
+
return;
|
36
|
+
}
|
37
|
+
|
38
|
+
if (tokens.length === 1 &&
|
39
|
+
(["Identifier", "Null", "Boolean"].indexOf(tokens[0].type) >= 0 ||
|
40
|
+
(tokens[0].type === "Numeric" && "" + +tokens[0].value === tokens[0].value))
|
41
|
+
) {
|
42
|
+
context.report(node, "Unnecessarily quoted property `{{value}}` found.", key);
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
/**
|
48
|
+
* Ensures that a property's key is quoted
|
49
|
+
* @param {ASTNode} node Property AST node
|
50
|
+
* @returns {void}
|
51
|
+
*/
|
52
|
+
function always(node) {
|
53
|
+
var key = node.key;
|
54
|
+
|
55
|
+
if (!node.method && !(key.type === "Literal" && typeof key.value === "string")) {
|
56
|
+
context.report(node, "Unquoted property `{{key}}` found.", {
|
57
|
+
key: key.name || key.value
|
58
|
+
});
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
return {
|
63
|
+
"Property": MODE === "as-needed" ? asNeeded : always
|
64
|
+
};
|
65
|
+
|
66
|
+
};
|
67
|
+
|
68
|
+
module.exports.schema = [
|
69
|
+
{
|
70
|
+
"enum": ["always", "as-needed"]
|
71
|
+
}
|
72
|
+
];
|
package/lib/rules/quotes.js
CHANGED
@@ -1,92 +1,92 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview A rule to choose between single and double quote marks
|
3
|
-
* @author Matt DuVall <http://www.mattduvall.com/>, Brandon Payton
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Constants
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
var QUOTE_SETTINGS = {
|
13
|
-
"double": {
|
14
|
-
quote: "\"",
|
15
|
-
alternateQuote: "'",
|
16
|
-
description: "doublequote"
|
17
|
-
},
|
18
|
-
"single": {
|
19
|
-
quote: "'",
|
20
|
-
alternateQuote: "\"",
|
21
|
-
description: "singlequote"
|
22
|
-
},
|
23
|
-
"backtick": {
|
24
|
-
quote: "`",
|
25
|
-
alternateQuote: "\"",
|
26
|
-
description: "backtick"
|
27
|
-
}
|
28
|
-
};
|
29
|
-
|
30
|
-
var AVOID_ESCAPE = "avoid-escape";
|
31
|
-
|
32
|
-
//------------------------------------------------------------------------------
|
33
|
-
// Rule Definition
|
34
|
-
//------------------------------------------------------------------------------
|
35
|
-
|
36
|
-
module.exports = function(context) {
|
37
|
-
|
38
|
-
/**
|
39
|
-
* Validate that a string passed in is surrounded by the specified character
|
40
|
-
* @param {string} val The text to check.
|
41
|
-
* @param {string} character The character to see if it's surrounded by.
|
42
|
-
* @returns {boolean} True if the text is surrounded by the character, false if not.
|
43
|
-
* @private
|
44
|
-
*/
|
45
|
-
function isSurroundedBy(val, character) {
|
46
|
-
return val[0] === character && val[val.length - 1] === character;
|
47
|
-
}
|
48
|
-
|
49
|
-
/**
|
50
|
-
* Determines if a given node is part of JSX syntax.
|
51
|
-
* @param {ASTNode} node The node to check.
|
52
|
-
* @returns {boolean} True if the node is a JSX node, false if not.
|
53
|
-
* @private
|
54
|
-
*/
|
55
|
-
function isJSXElement(node) {
|
56
|
-
return node.type.indexOf("JSX") === 0;
|
57
|
-
}
|
58
|
-
|
59
|
-
return {
|
60
|
-
|
61
|
-
"Literal": function(node) {
|
62
|
-
var val = node.value,
|
63
|
-
rawVal = node.raw,
|
64
|
-
quoteOption = context.options[0],
|
65
|
-
settings = QUOTE_SETTINGS[quoteOption || "double"],
|
66
|
-
avoidEscape = context.options[1] === AVOID_ESCAPE,
|
67
|
-
isValid;
|
68
|
-
|
69
|
-
if (settings && typeof val === "string") {
|
70
|
-
isValid = isJSXElement(node.parent) || isSurroundedBy(rawVal, settings.quote);
|
71
|
-
|
72
|
-
if (!isValid && avoidEscape) {
|
73
|
-
isValid = isSurroundedBy(rawVal, settings.alternateQuote) && rawVal.indexOf(settings.quote) >= 0;
|
74
|
-
}
|
75
|
-
|
76
|
-
if (!isValid) {
|
77
|
-
context.report(node, "Strings must use " + settings.description + ".");
|
78
|
-
}
|
79
|
-
}
|
80
|
-
}
|
81
|
-
};
|
82
|
-
|
83
|
-
};
|
84
|
-
|
85
|
-
module.exports.schema = [
|
86
|
-
{
|
87
|
-
"enum": ["single", "double", "backtick"]
|
88
|
-
},
|
89
|
-
{
|
90
|
-
"enum": ["avoid-escape"]
|
91
|
-
}
|
92
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview A rule to choose between single and double quote marks
|
3
|
+
* @author Matt DuVall <http://www.mattduvall.com/>, Brandon Payton
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Constants
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
var QUOTE_SETTINGS = {
|
13
|
+
"double": {
|
14
|
+
quote: "\"",
|
15
|
+
alternateQuote: "'",
|
16
|
+
description: "doublequote"
|
17
|
+
},
|
18
|
+
"single": {
|
19
|
+
quote: "'",
|
20
|
+
alternateQuote: "\"",
|
21
|
+
description: "singlequote"
|
22
|
+
},
|
23
|
+
"backtick": {
|
24
|
+
quote: "`",
|
25
|
+
alternateQuote: "\"",
|
26
|
+
description: "backtick"
|
27
|
+
}
|
28
|
+
};
|
29
|
+
|
30
|
+
var AVOID_ESCAPE = "avoid-escape";
|
31
|
+
|
32
|
+
//------------------------------------------------------------------------------
|
33
|
+
// Rule Definition
|
34
|
+
//------------------------------------------------------------------------------
|
35
|
+
|
36
|
+
module.exports = function(context) {
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Validate that a string passed in is surrounded by the specified character
|
40
|
+
* @param {string} val The text to check.
|
41
|
+
* @param {string} character The character to see if it's surrounded by.
|
42
|
+
* @returns {boolean} True if the text is surrounded by the character, false if not.
|
43
|
+
* @private
|
44
|
+
*/
|
45
|
+
function isSurroundedBy(val, character) {
|
46
|
+
return val[0] === character && val[val.length - 1] === character;
|
47
|
+
}
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Determines if a given node is part of JSX syntax.
|
51
|
+
* @param {ASTNode} node The node to check.
|
52
|
+
* @returns {boolean} True if the node is a JSX node, false if not.
|
53
|
+
* @private
|
54
|
+
*/
|
55
|
+
function isJSXElement(node) {
|
56
|
+
return node.type.indexOf("JSX") === 0;
|
57
|
+
}
|
58
|
+
|
59
|
+
return {
|
60
|
+
|
61
|
+
"Literal": function(node) {
|
62
|
+
var val = node.value,
|
63
|
+
rawVal = node.raw,
|
64
|
+
quoteOption = context.options[0],
|
65
|
+
settings = QUOTE_SETTINGS[quoteOption || "double"],
|
66
|
+
avoidEscape = context.options[1] === AVOID_ESCAPE,
|
67
|
+
isValid;
|
68
|
+
|
69
|
+
if (settings && typeof val === "string") {
|
70
|
+
isValid = isJSXElement(node.parent) || isSurroundedBy(rawVal, settings.quote);
|
71
|
+
|
72
|
+
if (!isValid && avoidEscape) {
|
73
|
+
isValid = isSurroundedBy(rawVal, settings.alternateQuote) && rawVal.indexOf(settings.quote) >= 0;
|
74
|
+
}
|
75
|
+
|
76
|
+
if (!isValid) {
|
77
|
+
context.report(node, "Strings must use " + settings.description + ".");
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
};
|
82
|
+
|
83
|
+
};
|
84
|
+
|
85
|
+
module.exports.schema = [
|
86
|
+
{
|
87
|
+
"enum": ["single", "double", "backtick"]
|
88
|
+
},
|
89
|
+
{
|
90
|
+
"enum": ["avoid-escape"]
|
91
|
+
}
|
92
|
+
];
|
package/lib/rules/radix.js
CHANGED
@@ -1,41 +1,41 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag use of parseInt without a radix argument
|
3
|
-
* @author James Allardice
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
return {
|
15
|
-
"CallExpression": function(node) {
|
16
|
-
|
17
|
-
var radix;
|
18
|
-
|
19
|
-
if (node.callee.name === "parseInt") {
|
20
|
-
|
21
|
-
if (node.arguments.length < 2) {
|
22
|
-
context.report(node, "Missing radix parameter.");
|
23
|
-
} else {
|
24
|
-
|
25
|
-
radix = node.arguments[1];
|
26
|
-
|
27
|
-
// don't allow non-numeric literals or undefined
|
28
|
-
if ((radix.type === "Literal" && typeof radix.value !== "number") ||
|
29
|
-
(radix.type === "Identifier" && radix.name === "undefined")
|
30
|
-
) {
|
31
|
-
context.report(node, "Invalid radix parameter.");
|
32
|
-
}
|
33
|
-
}
|
34
|
-
|
35
|
-
}
|
36
|
-
}
|
37
|
-
};
|
38
|
-
|
39
|
-
};
|
40
|
-
|
41
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag use of parseInt without a radix argument
|
3
|
+
* @author James Allardice
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
return {
|
15
|
+
"CallExpression": function(node) {
|
16
|
+
|
17
|
+
var radix;
|
18
|
+
|
19
|
+
if (node.callee.name === "parseInt") {
|
20
|
+
|
21
|
+
if (node.arguments.length < 2) {
|
22
|
+
context.report(node, "Missing radix parameter.");
|
23
|
+
} else {
|
24
|
+
|
25
|
+
radix = node.arguments[1];
|
26
|
+
|
27
|
+
// don't allow non-numeric literals or undefined
|
28
|
+
if ((radix.type === "Literal" && typeof radix.value !== "number") ||
|
29
|
+
(radix.type === "Identifier" && radix.name === "undefined")
|
30
|
+
) {
|
31
|
+
context.report(node, "Invalid radix parameter.");
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
}
|
36
|
+
}
|
37
|
+
};
|
38
|
+
|
39
|
+
};
|
40
|
+
|
41
|
+
module.exports.schema = [];
|