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,127 +1,127 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to check empty newline after "var" statement
|
3
|
-
* @author Gopal Venkatesan
|
4
|
-
* @copyright 2015 Gopal Venkatesan. All rights reserved.
|
5
|
-
* @copyright 2015 Casey Visco. All rights reserved.
|
6
|
-
*/
|
7
|
-
|
8
|
-
"use strict";
|
9
|
-
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
// Rule Definition
|
12
|
-
//------------------------------------------------------------------------------
|
13
|
-
|
14
|
-
module.exports = function(context) {
|
15
|
-
|
16
|
-
var ALWAYS_MESSAGE = "Expected blank line after variable declarations.",
|
17
|
-
NEVER_MESSAGE = "Unexpected blank line after variable declarations.";
|
18
|
-
|
19
|
-
// Default `mode` to "always". This means that invalid options will also
|
20
|
-
// be treated as "always" and the only special case is "never"
|
21
|
-
var mode = context.options[0] === "never" ? "never" : "always";
|
22
|
-
|
23
|
-
// Cache line numbers of comments for faster lookup
|
24
|
-
var comments = context.getAllComments().map(function (token) {
|
25
|
-
return token.loc.start.line;
|
26
|
-
});
|
27
|
-
|
28
|
-
|
29
|
-
//--------------------------------------------------------------------------
|
30
|
-
// Helpers
|
31
|
-
//--------------------------------------------------------------------------
|
32
|
-
|
33
|
-
/**
|
34
|
-
* Determine if provided keyword is a variable declaration
|
35
|
-
* @private
|
36
|
-
* @param {string} keyword - keyword to test
|
37
|
-
* @returns {boolean} True if `keyword` is a type of var
|
38
|
-
*/
|
39
|
-
function isVar(keyword) {
|
40
|
-
return keyword === "var" || keyword === "let" || keyword === "const";
|
41
|
-
}
|
42
|
-
|
43
|
-
/**
|
44
|
-
* Determine if provided keyword is a variant of for specifiers
|
45
|
-
* @private
|
46
|
-
* @param {string} keyword - keyword to test
|
47
|
-
* @returns {boolean} True if `keyword` is a variant of for specifier
|
48
|
-
*/
|
49
|
-
function isForTypeSpecifier(keyword) {
|
50
|
-
return keyword === "ForStatement" || keyword === "ForInStatement" || keyword === "ForOfStatement";
|
51
|
-
}
|
52
|
-
|
53
|
-
/**
|
54
|
-
* Determine if provided keyword is an export specifiers
|
55
|
-
* @private
|
56
|
-
* @param {string} nodeType - nodeType to test
|
57
|
-
* @returns {boolean} True if `nodeType` is an export specifier
|
58
|
-
*/
|
59
|
-
function isExportSpecifier(nodeType) {
|
60
|
-
return nodeType === "ExportNamedDeclaration" || nodeType === "ExportSpecifier" ||
|
61
|
-
nodeType === "ExportDefaultDeclaration" || nodeType === "ExportAllDeclaration";
|
62
|
-
}
|
63
|
-
|
64
|
-
/**
|
65
|
-
* Checks that a blank line exists after a variable declaration when mode is
|
66
|
-
* set to "always", or checks that there is no blank line when mode is set
|
67
|
-
* to "never"
|
68
|
-
* @private
|
69
|
-
* @param {ASTNode} node - `VariableDeclaration` node to test
|
70
|
-
* @returns {void}
|
71
|
-
*/
|
72
|
-
function checkForBlankLine(node) {
|
73
|
-
var lastToken = context.getLastToken(node),
|
74
|
-
nextToken = context.getTokenAfter(node),
|
75
|
-
nextLineNum = lastToken.loc.end.line + 1,
|
76
|
-
noNextLineToken,
|
77
|
-
hasNextLineComment;
|
78
|
-
|
79
|
-
// Ignore if there is no following statement
|
80
|
-
if (!nextToken) {
|
81
|
-
return;
|
82
|
-
}
|
83
|
-
|
84
|
-
// Ignore if parent of node is a for variant
|
85
|
-
if (isForTypeSpecifier(node.parent.type)) {
|
86
|
-
return;
|
87
|
-
}
|
88
|
-
|
89
|
-
// Ignore if parent of node is an export specifier
|
90
|
-
if (isExportSpecifier(node.parent.type)) {
|
91
|
-
return;
|
92
|
-
}
|
93
|
-
|
94
|
-
// Some coding styles use multiple `var` statements, so do nothing if
|
95
|
-
// the next token is a `var` statement.
|
96
|
-
if (nextToken.type === "Keyword" && isVar(nextToken.value)) {
|
97
|
-
return;
|
98
|
-
}
|
99
|
-
|
100
|
-
// Next statement is not a `var`...
|
101
|
-
noNextLineToken = nextToken.loc.start.line > nextLineNum;
|
102
|
-
hasNextLineComment = comments.indexOf(nextLineNum) >= 0;
|
103
|
-
|
104
|
-
if (mode === "never" && noNextLineToken && !hasNextLineComment) {
|
105
|
-
context.report(node, NEVER_MESSAGE, { identifier: node.name });
|
106
|
-
}
|
107
|
-
|
108
|
-
if (mode === "always" && (!noNextLineToken || hasNextLineComment)) {
|
109
|
-
context.report(node, ALWAYS_MESSAGE, { identifier: node.name });
|
110
|
-
}
|
111
|
-
}
|
112
|
-
|
113
|
-
//--------------------------------------------------------------------------
|
114
|
-
// Public
|
115
|
-
//--------------------------------------------------------------------------
|
116
|
-
|
117
|
-
return {
|
118
|
-
"VariableDeclaration": checkForBlankLine
|
119
|
-
};
|
120
|
-
|
121
|
-
};
|
122
|
-
|
123
|
-
module.exports.schema = [
|
124
|
-
{
|
125
|
-
"enum": ["never", "always"]
|
126
|
-
}
|
127
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to check empty newline after "var" statement
|
3
|
+
* @author Gopal Venkatesan
|
4
|
+
* @copyright 2015 Gopal Venkatesan. All rights reserved.
|
5
|
+
* @copyright 2015 Casey Visco. All rights reserved.
|
6
|
+
*/
|
7
|
+
|
8
|
+
"use strict";
|
9
|
+
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
// Rule Definition
|
12
|
+
//------------------------------------------------------------------------------
|
13
|
+
|
14
|
+
module.exports = function(context) {
|
15
|
+
|
16
|
+
var ALWAYS_MESSAGE = "Expected blank line after variable declarations.",
|
17
|
+
NEVER_MESSAGE = "Unexpected blank line after variable declarations.";
|
18
|
+
|
19
|
+
// Default `mode` to "always". This means that invalid options will also
|
20
|
+
// be treated as "always" and the only special case is "never"
|
21
|
+
var mode = context.options[0] === "never" ? "never" : "always";
|
22
|
+
|
23
|
+
// Cache line numbers of comments for faster lookup
|
24
|
+
var comments = context.getAllComments().map(function (token) {
|
25
|
+
return token.loc.start.line;
|
26
|
+
});
|
27
|
+
|
28
|
+
|
29
|
+
//--------------------------------------------------------------------------
|
30
|
+
// Helpers
|
31
|
+
//--------------------------------------------------------------------------
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Determine if provided keyword is a variable declaration
|
35
|
+
* @private
|
36
|
+
* @param {string} keyword - keyword to test
|
37
|
+
* @returns {boolean} True if `keyword` is a type of var
|
38
|
+
*/
|
39
|
+
function isVar(keyword) {
|
40
|
+
return keyword === "var" || keyword === "let" || keyword === "const";
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Determine if provided keyword is a variant of for specifiers
|
45
|
+
* @private
|
46
|
+
* @param {string} keyword - keyword to test
|
47
|
+
* @returns {boolean} True if `keyword` is a variant of for specifier
|
48
|
+
*/
|
49
|
+
function isForTypeSpecifier(keyword) {
|
50
|
+
return keyword === "ForStatement" || keyword === "ForInStatement" || keyword === "ForOfStatement";
|
51
|
+
}
|
52
|
+
|
53
|
+
/**
|
54
|
+
* Determine if provided keyword is an export specifiers
|
55
|
+
* @private
|
56
|
+
* @param {string} nodeType - nodeType to test
|
57
|
+
* @returns {boolean} True if `nodeType` is an export specifier
|
58
|
+
*/
|
59
|
+
function isExportSpecifier(nodeType) {
|
60
|
+
return nodeType === "ExportNamedDeclaration" || nodeType === "ExportSpecifier" ||
|
61
|
+
nodeType === "ExportDefaultDeclaration" || nodeType === "ExportAllDeclaration";
|
62
|
+
}
|
63
|
+
|
64
|
+
/**
|
65
|
+
* Checks that a blank line exists after a variable declaration when mode is
|
66
|
+
* set to "always", or checks that there is no blank line when mode is set
|
67
|
+
* to "never"
|
68
|
+
* @private
|
69
|
+
* @param {ASTNode} node - `VariableDeclaration` node to test
|
70
|
+
* @returns {void}
|
71
|
+
*/
|
72
|
+
function checkForBlankLine(node) {
|
73
|
+
var lastToken = context.getLastToken(node),
|
74
|
+
nextToken = context.getTokenAfter(node),
|
75
|
+
nextLineNum = lastToken.loc.end.line + 1,
|
76
|
+
noNextLineToken,
|
77
|
+
hasNextLineComment;
|
78
|
+
|
79
|
+
// Ignore if there is no following statement
|
80
|
+
if (!nextToken) {
|
81
|
+
return;
|
82
|
+
}
|
83
|
+
|
84
|
+
// Ignore if parent of node is a for variant
|
85
|
+
if (isForTypeSpecifier(node.parent.type)) {
|
86
|
+
return;
|
87
|
+
}
|
88
|
+
|
89
|
+
// Ignore if parent of node is an export specifier
|
90
|
+
if (isExportSpecifier(node.parent.type)) {
|
91
|
+
return;
|
92
|
+
}
|
93
|
+
|
94
|
+
// Some coding styles use multiple `var` statements, so do nothing if
|
95
|
+
// the next token is a `var` statement.
|
96
|
+
if (nextToken.type === "Keyword" && isVar(nextToken.value)) {
|
97
|
+
return;
|
98
|
+
}
|
99
|
+
|
100
|
+
// Next statement is not a `var`...
|
101
|
+
noNextLineToken = nextToken.loc.start.line > nextLineNum;
|
102
|
+
hasNextLineComment = comments.indexOf(nextLineNum) >= 0;
|
103
|
+
|
104
|
+
if (mode === "never" && noNextLineToken && !hasNextLineComment) {
|
105
|
+
context.report(node, NEVER_MESSAGE, { identifier: node.name });
|
106
|
+
}
|
107
|
+
|
108
|
+
if (mode === "always" && (!noNextLineToken || hasNextLineComment)) {
|
109
|
+
context.report(node, ALWAYS_MESSAGE, { identifier: node.name });
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
//--------------------------------------------------------------------------
|
114
|
+
// Public
|
115
|
+
//--------------------------------------------------------------------------
|
116
|
+
|
117
|
+
return {
|
118
|
+
"VariableDeclaration": checkForBlankLine
|
119
|
+
};
|
120
|
+
|
121
|
+
};
|
122
|
+
|
123
|
+
module.exports.schema = [
|
124
|
+
{
|
125
|
+
"enum": ["never", "always"]
|
126
|
+
}
|
127
|
+
];
|
package/lib/rules/no-alert.js
CHANGED
@@ -1,153 +1,153 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag use of alert, confirm, prompt
|
3
|
-
* @author Nicholas C. Zakas
|
4
|
-
* @copyright 2015 Mathias Schreck
|
5
|
-
* @copyright 2013 Nicholas C. Zakas
|
6
|
-
*/
|
7
|
-
"use strict";
|
8
|
-
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
// Helpers
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
|
13
|
-
/**
|
14
|
-
* Checks if the given name is a prohibited identifier.
|
15
|
-
* @param {string} name The name to check
|
16
|
-
* @returns {boolean} Whether or not the name is prohibited.
|
17
|
-
*/
|
18
|
-
function isProhibitedIdentifier(name) {
|
19
|
-
return /^(alert|confirm|prompt)$/.test(name);
|
20
|
-
}
|
21
|
-
|
22
|
-
/**
|
23
|
-
* Reports the given node and identifier name.
|
24
|
-
* @param {RuleContext} context The ESLint rule context.
|
25
|
-
* @param {ASTNode} node The node to report on.
|
26
|
-
* @param {string} identifierName The name of the identifier.
|
27
|
-
* @returns {void}
|
28
|
-
*/
|
29
|
-
function report(context, node, identifierName) {
|
30
|
-
context.report(node, "Unexpected {{name}}.", { name: identifierName });
|
31
|
-
}
|
32
|
-
|
33
|
-
/**
|
34
|
-
* Returns the property name of a MemberExpression.
|
35
|
-
* @param {ASTNode} memberExpressionNode The MemberExpression node.
|
36
|
-
* @returns {string|undefined} Returns the property name if available, undefined else.
|
37
|
-
*/
|
38
|
-
function getPropertyName(memberExpressionNode) {
|
39
|
-
if (memberExpressionNode.computed) {
|
40
|
-
if (memberExpressionNode.property.type === "Literal") {
|
41
|
-
return memberExpressionNode.property.value;
|
42
|
-
}
|
43
|
-
} else {
|
44
|
-
return memberExpressionNode.property.name;
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
|
-
/**
|
49
|
-
* Finds the escope reference in the given scope.
|
50
|
-
* @param {Object} scope The scope to search.
|
51
|
-
* @param {ASTNode} node The identifier node.
|
52
|
-
* @returns {Reference|undefined} Returns the found reference or undefined if none were found.
|
53
|
-
*/
|
54
|
-
function findReference(scope, node) {
|
55
|
-
var references = scope.references.filter(function (reference) {
|
56
|
-
return reference.identifier.range[0] === node.range[0] &&
|
57
|
-
reference.identifier.range[1] === node.range[1];
|
58
|
-
});
|
59
|
-
|
60
|
-
if (references.length === 1) {
|
61
|
-
return references[0];
|
62
|
-
}
|
63
|
-
}
|
64
|
-
|
65
|
-
/**
|
66
|
-
* Checks if the given identifier name is shadowed in the given global scope.
|
67
|
-
* @param {Object} globalScope The global scope.
|
68
|
-
* @param {string} identifierName The identifier name to check
|
69
|
-
* @returns {boolean} Whether or not the name is shadowed globally.
|
70
|
-
*/
|
71
|
-
function isGloballyShadowed(globalScope, identifierName) {
|
72
|
-
return globalScope.variables.some(function (variable) {
|
73
|
-
return variable.name === identifierName && variable.defs.length > 0;
|
74
|
-
});
|
75
|
-
}
|
76
|
-
|
77
|
-
/**
|
78
|
-
* Checks if the given identifier node is shadowed in the given scope.
|
79
|
-
* @param {Object} scope The current scope.
|
80
|
-
* @param {Object} globalScope The global scope.
|
81
|
-
* @param {string} node The identifier node to check
|
82
|
-
* @returns {boolean} Whether or not the name is shadowed.
|
83
|
-
*/
|
84
|
-
function isShadowed(scope, globalScope, node) {
|
85
|
-
var reference = findReference(scope, node),
|
86
|
-
identifierName = node.name;
|
87
|
-
|
88
|
-
if (reference) {
|
89
|
-
if (reference.resolved || isGloballyShadowed(globalScope, identifierName)) {
|
90
|
-
return true;
|
91
|
-
}
|
92
|
-
}
|
93
|
-
|
94
|
-
return false;
|
95
|
-
}
|
96
|
-
|
97
|
-
/**
|
98
|
-
* Checks if the given identifier node is a ThisExpression in the global scope or the global window property.
|
99
|
-
* @param {Object} scope The current scope.
|
100
|
-
* @param {Object} globalScope The global scope.
|
101
|
-
* @param {string} node The identifier node to check
|
102
|
-
* @returns {boolean} Whether or not the node is a reference to the global object.
|
103
|
-
*/
|
104
|
-
function isGlobalThisReferenceOrGlobalWindow(scope, globalScope, node) {
|
105
|
-
if (scope.type === "global" && node.type === "ThisExpression") {
|
106
|
-
return true;
|
107
|
-
} else if (node.name === "window") {
|
108
|
-
return !isShadowed(scope, globalScope, node);
|
109
|
-
}
|
110
|
-
|
111
|
-
return false;
|
112
|
-
}
|
113
|
-
|
114
|
-
//------------------------------------------------------------------------------
|
115
|
-
// Rule Definition
|
116
|
-
//------------------------------------------------------------------------------
|
117
|
-
|
118
|
-
module.exports = function(context) {
|
119
|
-
var globalScope;
|
120
|
-
|
121
|
-
return {
|
122
|
-
|
123
|
-
"Program": function () {
|
124
|
-
globalScope = context.getScope();
|
125
|
-
},
|
126
|
-
|
127
|
-
"CallExpression": function(node) {
|
128
|
-
var callee = node.callee,
|
129
|
-
identifierName,
|
130
|
-
currentScope = context.getScope();
|
131
|
-
|
132
|
-
// without window.
|
133
|
-
if (callee.type === "Identifier") {
|
134
|
-
identifierName = callee.name;
|
135
|
-
|
136
|
-
if (!isShadowed(currentScope, globalScope, callee) && isProhibitedIdentifier(callee.name)) {
|
137
|
-
report(context, node, identifierName);
|
138
|
-
}
|
139
|
-
|
140
|
-
} else if (callee.type === "MemberExpression" && isGlobalThisReferenceOrGlobalWindow(currentScope, globalScope, callee.object)) {
|
141
|
-
identifierName = getPropertyName(callee);
|
142
|
-
|
143
|
-
if (isProhibitedIdentifier(identifierName)) {
|
144
|
-
report(context, node, identifierName);
|
145
|
-
}
|
146
|
-
}
|
147
|
-
|
148
|
-
}
|
149
|
-
};
|
150
|
-
|
151
|
-
};
|
152
|
-
|
153
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag use of alert, confirm, prompt
|
3
|
+
* @author Nicholas C. Zakas
|
4
|
+
* @copyright 2015 Mathias Schreck
|
5
|
+
* @copyright 2013 Nicholas C. Zakas
|
6
|
+
*/
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
// Helpers
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
/**
|
14
|
+
* Checks if the given name is a prohibited identifier.
|
15
|
+
* @param {string} name The name to check
|
16
|
+
* @returns {boolean} Whether or not the name is prohibited.
|
17
|
+
*/
|
18
|
+
function isProhibitedIdentifier(name) {
|
19
|
+
return /^(alert|confirm|prompt)$/.test(name);
|
20
|
+
}
|
21
|
+
|
22
|
+
/**
|
23
|
+
* Reports the given node and identifier name.
|
24
|
+
* @param {RuleContext} context The ESLint rule context.
|
25
|
+
* @param {ASTNode} node The node to report on.
|
26
|
+
* @param {string} identifierName The name of the identifier.
|
27
|
+
* @returns {void}
|
28
|
+
*/
|
29
|
+
function report(context, node, identifierName) {
|
30
|
+
context.report(node, "Unexpected {{name}}.", { name: identifierName });
|
31
|
+
}
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Returns the property name of a MemberExpression.
|
35
|
+
* @param {ASTNode} memberExpressionNode The MemberExpression node.
|
36
|
+
* @returns {string|undefined} Returns the property name if available, undefined else.
|
37
|
+
*/
|
38
|
+
function getPropertyName(memberExpressionNode) {
|
39
|
+
if (memberExpressionNode.computed) {
|
40
|
+
if (memberExpressionNode.property.type === "Literal") {
|
41
|
+
return memberExpressionNode.property.value;
|
42
|
+
}
|
43
|
+
} else {
|
44
|
+
return memberExpressionNode.property.name;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
/**
|
49
|
+
* Finds the escope reference in the given scope.
|
50
|
+
* @param {Object} scope The scope to search.
|
51
|
+
* @param {ASTNode} node The identifier node.
|
52
|
+
* @returns {Reference|undefined} Returns the found reference or undefined if none were found.
|
53
|
+
*/
|
54
|
+
function findReference(scope, node) {
|
55
|
+
var references = scope.references.filter(function (reference) {
|
56
|
+
return reference.identifier.range[0] === node.range[0] &&
|
57
|
+
reference.identifier.range[1] === node.range[1];
|
58
|
+
});
|
59
|
+
|
60
|
+
if (references.length === 1) {
|
61
|
+
return references[0];
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
/**
|
66
|
+
* Checks if the given identifier name is shadowed in the given global scope.
|
67
|
+
* @param {Object} globalScope The global scope.
|
68
|
+
* @param {string} identifierName The identifier name to check
|
69
|
+
* @returns {boolean} Whether or not the name is shadowed globally.
|
70
|
+
*/
|
71
|
+
function isGloballyShadowed(globalScope, identifierName) {
|
72
|
+
return globalScope.variables.some(function (variable) {
|
73
|
+
return variable.name === identifierName && variable.defs.length > 0;
|
74
|
+
});
|
75
|
+
}
|
76
|
+
|
77
|
+
/**
|
78
|
+
* Checks if the given identifier node is shadowed in the given scope.
|
79
|
+
* @param {Object} scope The current scope.
|
80
|
+
* @param {Object} globalScope The global scope.
|
81
|
+
* @param {string} node The identifier node to check
|
82
|
+
* @returns {boolean} Whether or not the name is shadowed.
|
83
|
+
*/
|
84
|
+
function isShadowed(scope, globalScope, node) {
|
85
|
+
var reference = findReference(scope, node),
|
86
|
+
identifierName = node.name;
|
87
|
+
|
88
|
+
if (reference) {
|
89
|
+
if (reference.resolved || isGloballyShadowed(globalScope, identifierName)) {
|
90
|
+
return true;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
return false;
|
95
|
+
}
|
96
|
+
|
97
|
+
/**
|
98
|
+
* Checks if the given identifier node is a ThisExpression in the global scope or the global window property.
|
99
|
+
* @param {Object} scope The current scope.
|
100
|
+
* @param {Object} globalScope The global scope.
|
101
|
+
* @param {string} node The identifier node to check
|
102
|
+
* @returns {boolean} Whether or not the node is a reference to the global object.
|
103
|
+
*/
|
104
|
+
function isGlobalThisReferenceOrGlobalWindow(scope, globalScope, node) {
|
105
|
+
if (scope.type === "global" && node.type === "ThisExpression") {
|
106
|
+
return true;
|
107
|
+
} else if (node.name === "window") {
|
108
|
+
return !isShadowed(scope, globalScope, node);
|
109
|
+
}
|
110
|
+
|
111
|
+
return false;
|
112
|
+
}
|
113
|
+
|
114
|
+
//------------------------------------------------------------------------------
|
115
|
+
// Rule Definition
|
116
|
+
//------------------------------------------------------------------------------
|
117
|
+
|
118
|
+
module.exports = function(context) {
|
119
|
+
var globalScope;
|
120
|
+
|
121
|
+
return {
|
122
|
+
|
123
|
+
"Program": function () {
|
124
|
+
globalScope = context.getScope();
|
125
|
+
},
|
126
|
+
|
127
|
+
"CallExpression": function(node) {
|
128
|
+
var callee = node.callee,
|
129
|
+
identifierName,
|
130
|
+
currentScope = context.getScope();
|
131
|
+
|
132
|
+
// without window.
|
133
|
+
if (callee.type === "Identifier") {
|
134
|
+
identifierName = callee.name;
|
135
|
+
|
136
|
+
if (!isShadowed(currentScope, globalScope, callee) && isProhibitedIdentifier(callee.name)) {
|
137
|
+
report(context, node, identifierName);
|
138
|
+
}
|
139
|
+
|
140
|
+
} else if (callee.type === "MemberExpression" && isGlobalThisReferenceOrGlobalWindow(currentScope, globalScope, callee.object)) {
|
141
|
+
identifierName = getPropertyName(callee);
|
142
|
+
|
143
|
+
if (isProhibitedIdentifier(identifierName)) {
|
144
|
+
report(context, node, identifierName);
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
}
|
149
|
+
};
|
150
|
+
|
151
|
+
};
|
152
|
+
|
153
|
+
module.exports.schema = [];
|
@@ -1,31 +1,31 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Disallow construction of dense arrays using the Array constructor
|
3
|
-
* @author Matt DuVall <http://www.mattduvall.com/>
|
4
|
-
*/
|
5
|
-
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
function check(node) {
|
15
|
-
if (
|
16
|
-
node.arguments.length !== 1 &&
|
17
|
-
node.callee.type === "Identifier" &&
|
18
|
-
node.callee.name === "Array"
|
19
|
-
) {
|
20
|
-
context.report(node, "The array literal notation [] is preferrable.");
|
21
|
-
}
|
22
|
-
}
|
23
|
-
|
24
|
-
return {
|
25
|
-
"CallExpression": check,
|
26
|
-
"NewExpression": check
|
27
|
-
};
|
28
|
-
|
29
|
-
};
|
30
|
-
|
31
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Disallow construction of dense arrays using the Array constructor
|
3
|
+
* @author Matt DuVall <http://www.mattduvall.com/>
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
function check(node) {
|
15
|
+
if (
|
16
|
+
node.arguments.length !== 1 &&
|
17
|
+
node.callee.type === "Identifier" &&
|
18
|
+
node.callee.name === "Array"
|
19
|
+
) {
|
20
|
+
context.report(node, "The array literal notation [] is preferrable.");
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
return {
|
25
|
+
"CallExpression": check,
|
26
|
+
"NewExpression": check
|
27
|
+
};
|
28
|
+
|
29
|
+
};
|
30
|
+
|
31
|
+
module.exports.schema = [];
|