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
package/lib/rules/strict.js
CHANGED
@@ -1,242 +1,242 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to control usage of strict mode directives.
|
3
|
-
* @author Brandon Mills
|
4
|
-
* @copyright 2015 Brandon Mills. All rights reserved.
|
5
|
-
* @copyright 2013-2014 Nicholas C. Zakas. All rights reserved.
|
6
|
-
* @copyright 2013 Ian Christian Myers. All rights reserved.
|
7
|
-
*/
|
8
|
-
|
9
|
-
"use strict";
|
10
|
-
|
11
|
-
//------------------------------------------------------------------------------
|
12
|
-
// Helpers
|
13
|
-
//------------------------------------------------------------------------------
|
14
|
-
|
15
|
-
var messages = {
|
16
|
-
function: "Use the function form of \"use strict\".",
|
17
|
-
global: "Use the global form of \"use strict\".",
|
18
|
-
multiple: "Multiple \"use strict\" directives.",
|
19
|
-
never: "Strict mode is not permitted.",
|
20
|
-
unnecessary: "Unnecessary \"use strict\" directive."
|
21
|
-
};
|
22
|
-
|
23
|
-
/**
|
24
|
-
* Gets all of the Use Strict Directives in the Directive Prologue of a group of
|
25
|
-
* statements.
|
26
|
-
* @param {ASTNode[]} statements Statements in the program or function body.
|
27
|
-
* @returns {ASTNode[]} All of the Use Strict Directives.
|
28
|
-
*/
|
29
|
-
function getUseStrictDirectives(statements) {
|
30
|
-
var directives = [],
|
31
|
-
i, statement;
|
32
|
-
|
33
|
-
for (i = 0; i < statements.length; i++) {
|
34
|
-
statement = statements[i];
|
35
|
-
|
36
|
-
if (
|
37
|
-
statement.type === "ExpressionStatement" &&
|
38
|
-
statement.expression.type === "Literal" &&
|
39
|
-
statement.expression.value === "use strict"
|
40
|
-
) {
|
41
|
-
directives[i] = statement;
|
42
|
-
} else {
|
43
|
-
break;
|
44
|
-
}
|
45
|
-
}
|
46
|
-
|
47
|
-
return directives;
|
48
|
-
}
|
49
|
-
|
50
|
-
//------------------------------------------------------------------------------
|
51
|
-
// Rule Definition
|
52
|
-
//------------------------------------------------------------------------------
|
53
|
-
|
54
|
-
module.exports = function(context) {
|
55
|
-
|
56
|
-
var mode = context.options[0],
|
57
|
-
isModule = context.ecmaFeatures.modules,
|
58
|
-
modes = {},
|
59
|
-
scopes = [];
|
60
|
-
|
61
|
-
/**
|
62
|
-
* Report a node or array of nodes with a given message.
|
63
|
-
* @param {(ASTNode|ASTNode[])} nodes Node or nodes to report.
|
64
|
-
* @param {string} message Message to display.
|
65
|
-
* @returns {void}
|
66
|
-
*/
|
67
|
-
function report(nodes, message) {
|
68
|
-
var i;
|
69
|
-
|
70
|
-
if (Array.isArray(nodes)) {
|
71
|
-
for (i = 0; i < nodes.length; i++) {
|
72
|
-
context.report(nodes[i], message);
|
73
|
-
}
|
74
|
-
} else {
|
75
|
-
context.report(nodes, message);
|
76
|
-
}
|
77
|
-
}
|
78
|
-
|
79
|
-
//--------------------------------------------------------------------------
|
80
|
-
// "deprecated" mode (default)
|
81
|
-
//--------------------------------------------------------------------------
|
82
|
-
|
83
|
-
/**
|
84
|
-
* Determines if a given node is "use strict".
|
85
|
-
* @param {ASTNode} node The node to check.
|
86
|
-
* @returns {boolean} True if the node is a strict pragma, false if not.
|
87
|
-
* @void
|
88
|
-
*/
|
89
|
-
function isStrictPragma(node) {
|
90
|
-
return (node && node.type === "ExpressionStatement" &&
|
91
|
-
node.expression.value === "use strict");
|
92
|
-
}
|
93
|
-
|
94
|
-
/**
|
95
|
-
* When you enter a scope, push the strict value from the previous scope
|
96
|
-
* onto the stack.
|
97
|
-
* @param {ASTNode} node The AST node being checked.
|
98
|
-
* @returns {void}
|
99
|
-
* @private
|
100
|
-
*/
|
101
|
-
function enterScope(node) {
|
102
|
-
|
103
|
-
var isStrict = false,
|
104
|
-
isProgram = (node.type === "Program"),
|
105
|
-
isParentGlobal = scopes.length === 1,
|
106
|
-
isParentStrict = scopes.length ? scopes[scopes.length - 1] : false;
|
107
|
-
|
108
|
-
// look for the "use strict" pragma
|
109
|
-
if (isModule) {
|
110
|
-
isStrict = true;
|
111
|
-
} else if (isProgram) {
|
112
|
-
isStrict = isStrictPragma(node.body[0]) || isParentStrict;
|
113
|
-
} else {
|
114
|
-
isStrict = node.body.body && isStrictPragma(node.body.body[0]) || isParentStrict;
|
115
|
-
}
|
116
|
-
|
117
|
-
scopes.push(isStrict);
|
118
|
-
|
119
|
-
// never warn if the parent is strict or the function is strict
|
120
|
-
if (!isParentStrict && !isStrict && isParentGlobal) {
|
121
|
-
context.report(node, "Missing \"use strict\" statement.");
|
122
|
-
}
|
123
|
-
}
|
124
|
-
|
125
|
-
/**
|
126
|
-
* When you exit a scope, pop off the top scope and see if it's true or
|
127
|
-
* false.
|
128
|
-
* @returns {void}
|
129
|
-
* @private
|
130
|
-
*/
|
131
|
-
function exitScope() {
|
132
|
-
scopes.pop();
|
133
|
-
}
|
134
|
-
|
135
|
-
modes.deprecated = {
|
136
|
-
"Program": enterScope,
|
137
|
-
"FunctionDeclaration": enterScope,
|
138
|
-
"FunctionExpression": enterScope,
|
139
|
-
"ArrowFunctionExpression": enterScope,
|
140
|
-
|
141
|
-
"Program:exit": exitScope,
|
142
|
-
"FunctionDeclaration:exit": exitScope,
|
143
|
-
"FunctionExpression:exit": exitScope,
|
144
|
-
"ArrowFunctionExpression:exit": exitScope
|
145
|
-
};
|
146
|
-
|
147
|
-
//--------------------------------------------------------------------------
|
148
|
-
// "never" mode
|
149
|
-
//--------------------------------------------------------------------------
|
150
|
-
|
151
|
-
modes.never = {
|
152
|
-
"Program": function(node) {
|
153
|
-
report(getUseStrictDirectives(node.body), messages.never);
|
154
|
-
},
|
155
|
-
"FunctionDeclaration": function(node) {
|
156
|
-
report(getUseStrictDirectives(node.body.body), messages.never);
|
157
|
-
},
|
158
|
-
"FunctionExpression": function(node) {
|
159
|
-
report(getUseStrictDirectives(node.body.body), messages.never);
|
160
|
-
}
|
161
|
-
};
|
162
|
-
|
163
|
-
//--------------------------------------------------------------------------
|
164
|
-
// "global" mode
|
165
|
-
//--------------------------------------------------------------------------
|
166
|
-
|
167
|
-
modes.global = {
|
168
|
-
"Program": function(node) {
|
169
|
-
var useStrictDirectives = getUseStrictDirectives(node.body);
|
170
|
-
|
171
|
-
if (!isModule && node.body.length && useStrictDirectives.length < 1) {
|
172
|
-
report(node, messages.global);
|
173
|
-
} else if (isModule) {
|
174
|
-
report(useStrictDirectives, messages.unnecessary);
|
175
|
-
} else {
|
176
|
-
report(useStrictDirectives.slice(1), messages.multiple);
|
177
|
-
}
|
178
|
-
},
|
179
|
-
"FunctionDeclaration": function(node) {
|
180
|
-
report(getUseStrictDirectives(node.body.body), messages.global);
|
181
|
-
},
|
182
|
-
"FunctionExpression": function(node) {
|
183
|
-
report(getUseStrictDirectives(node.body.body), messages.global);
|
184
|
-
}
|
185
|
-
};
|
186
|
-
|
187
|
-
//--------------------------------------------------------------------------
|
188
|
-
// "function" mode
|
189
|
-
//--------------------------------------------------------------------------
|
190
|
-
|
191
|
-
/**
|
192
|
-
* Entering a function pushes a new nested scope onto the stack. The new
|
193
|
-
* scope is true if the nested function is strict mode code.
|
194
|
-
* @param {ASTNode} node The function declaration or expression.
|
195
|
-
* @returns {void}
|
196
|
-
*/
|
197
|
-
function enterFunction(node) {
|
198
|
-
var useStrictDirectives = getUseStrictDirectives(node.body.body),
|
199
|
-
isParentGlobal = scopes.length === 0,
|
200
|
-
isParentStrict = isModule || (scopes.length && scopes[scopes.length - 1]),
|
201
|
-
isStrict = useStrictDirectives.length > 0 || isModule;
|
202
|
-
|
203
|
-
if (isStrict) {
|
204
|
-
if (isParentStrict && useStrictDirectives.length) {
|
205
|
-
report(useStrictDirectives[0], messages.unnecessary);
|
206
|
-
}
|
207
|
-
|
208
|
-
report(useStrictDirectives.slice(1), messages.multiple);
|
209
|
-
} else if (isParentGlobal && !isModule) {
|
210
|
-
report(node, messages.function);
|
211
|
-
}
|
212
|
-
|
213
|
-
scopes.push(isParentStrict || isStrict);
|
214
|
-
}
|
215
|
-
|
216
|
-
/**
|
217
|
-
* Exiting a function pops its scope off the stack.
|
218
|
-
* @returns {void}
|
219
|
-
*/
|
220
|
-
function exitFunction() {
|
221
|
-
scopes.pop();
|
222
|
-
}
|
223
|
-
|
224
|
-
modes.function = {
|
225
|
-
"Program": function(node) {
|
226
|
-
report(getUseStrictDirectives(node.body), messages.function);
|
227
|
-
},
|
228
|
-
"FunctionDeclaration": enterFunction,
|
229
|
-
"FunctionExpression": enterFunction,
|
230
|
-
"FunctionDeclaration:exit": exitFunction,
|
231
|
-
"FunctionExpression:exit": exitFunction
|
232
|
-
};
|
233
|
-
|
234
|
-
return modes[mode || "deprecated"];
|
235
|
-
|
236
|
-
};
|
237
|
-
|
238
|
-
module.exports.schema = [
|
239
|
-
{
|
240
|
-
"enum": ["never", "global", "function"]
|
241
|
-
}
|
242
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to control usage of strict mode directives.
|
3
|
+
* @author Brandon Mills
|
4
|
+
* @copyright 2015 Brandon Mills. All rights reserved.
|
5
|
+
* @copyright 2013-2014 Nicholas C. Zakas. All rights reserved.
|
6
|
+
* @copyright 2013 Ian Christian Myers. All rights reserved.
|
7
|
+
*/
|
8
|
+
|
9
|
+
"use strict";
|
10
|
+
|
11
|
+
//------------------------------------------------------------------------------
|
12
|
+
// Helpers
|
13
|
+
//------------------------------------------------------------------------------
|
14
|
+
|
15
|
+
var messages = {
|
16
|
+
function: "Use the function form of \"use strict\".",
|
17
|
+
global: "Use the global form of \"use strict\".",
|
18
|
+
multiple: "Multiple \"use strict\" directives.",
|
19
|
+
never: "Strict mode is not permitted.",
|
20
|
+
unnecessary: "Unnecessary \"use strict\" directive."
|
21
|
+
};
|
22
|
+
|
23
|
+
/**
|
24
|
+
* Gets all of the Use Strict Directives in the Directive Prologue of a group of
|
25
|
+
* statements.
|
26
|
+
* @param {ASTNode[]} statements Statements in the program or function body.
|
27
|
+
* @returns {ASTNode[]} All of the Use Strict Directives.
|
28
|
+
*/
|
29
|
+
function getUseStrictDirectives(statements) {
|
30
|
+
var directives = [],
|
31
|
+
i, statement;
|
32
|
+
|
33
|
+
for (i = 0; i < statements.length; i++) {
|
34
|
+
statement = statements[i];
|
35
|
+
|
36
|
+
if (
|
37
|
+
statement.type === "ExpressionStatement" &&
|
38
|
+
statement.expression.type === "Literal" &&
|
39
|
+
statement.expression.value === "use strict"
|
40
|
+
) {
|
41
|
+
directives[i] = statement;
|
42
|
+
} else {
|
43
|
+
break;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
return directives;
|
48
|
+
}
|
49
|
+
|
50
|
+
//------------------------------------------------------------------------------
|
51
|
+
// Rule Definition
|
52
|
+
//------------------------------------------------------------------------------
|
53
|
+
|
54
|
+
module.exports = function(context) {
|
55
|
+
|
56
|
+
var mode = context.options[0],
|
57
|
+
isModule = context.ecmaFeatures.modules,
|
58
|
+
modes = {},
|
59
|
+
scopes = [];
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Report a node or array of nodes with a given message.
|
63
|
+
* @param {(ASTNode|ASTNode[])} nodes Node or nodes to report.
|
64
|
+
* @param {string} message Message to display.
|
65
|
+
* @returns {void}
|
66
|
+
*/
|
67
|
+
function report(nodes, message) {
|
68
|
+
var i;
|
69
|
+
|
70
|
+
if (Array.isArray(nodes)) {
|
71
|
+
for (i = 0; i < nodes.length; i++) {
|
72
|
+
context.report(nodes[i], message);
|
73
|
+
}
|
74
|
+
} else {
|
75
|
+
context.report(nodes, message);
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
//--------------------------------------------------------------------------
|
80
|
+
// "deprecated" mode (default)
|
81
|
+
//--------------------------------------------------------------------------
|
82
|
+
|
83
|
+
/**
|
84
|
+
* Determines if a given node is "use strict".
|
85
|
+
* @param {ASTNode} node The node to check.
|
86
|
+
* @returns {boolean} True if the node is a strict pragma, false if not.
|
87
|
+
* @void
|
88
|
+
*/
|
89
|
+
function isStrictPragma(node) {
|
90
|
+
return (node && node.type === "ExpressionStatement" &&
|
91
|
+
node.expression.value === "use strict");
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
* When you enter a scope, push the strict value from the previous scope
|
96
|
+
* onto the stack.
|
97
|
+
* @param {ASTNode} node The AST node being checked.
|
98
|
+
* @returns {void}
|
99
|
+
* @private
|
100
|
+
*/
|
101
|
+
function enterScope(node) {
|
102
|
+
|
103
|
+
var isStrict = false,
|
104
|
+
isProgram = (node.type === "Program"),
|
105
|
+
isParentGlobal = scopes.length === 1,
|
106
|
+
isParentStrict = scopes.length ? scopes[scopes.length - 1] : false;
|
107
|
+
|
108
|
+
// look for the "use strict" pragma
|
109
|
+
if (isModule) {
|
110
|
+
isStrict = true;
|
111
|
+
} else if (isProgram) {
|
112
|
+
isStrict = isStrictPragma(node.body[0]) || isParentStrict;
|
113
|
+
} else {
|
114
|
+
isStrict = node.body.body && isStrictPragma(node.body.body[0]) || isParentStrict;
|
115
|
+
}
|
116
|
+
|
117
|
+
scopes.push(isStrict);
|
118
|
+
|
119
|
+
// never warn if the parent is strict or the function is strict
|
120
|
+
if (!isParentStrict && !isStrict && isParentGlobal) {
|
121
|
+
context.report(node, "Missing \"use strict\" statement.");
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
/**
|
126
|
+
* When you exit a scope, pop off the top scope and see if it's true or
|
127
|
+
* false.
|
128
|
+
* @returns {void}
|
129
|
+
* @private
|
130
|
+
*/
|
131
|
+
function exitScope() {
|
132
|
+
scopes.pop();
|
133
|
+
}
|
134
|
+
|
135
|
+
modes.deprecated = {
|
136
|
+
"Program": enterScope,
|
137
|
+
"FunctionDeclaration": enterScope,
|
138
|
+
"FunctionExpression": enterScope,
|
139
|
+
"ArrowFunctionExpression": enterScope,
|
140
|
+
|
141
|
+
"Program:exit": exitScope,
|
142
|
+
"FunctionDeclaration:exit": exitScope,
|
143
|
+
"FunctionExpression:exit": exitScope,
|
144
|
+
"ArrowFunctionExpression:exit": exitScope
|
145
|
+
};
|
146
|
+
|
147
|
+
//--------------------------------------------------------------------------
|
148
|
+
// "never" mode
|
149
|
+
//--------------------------------------------------------------------------
|
150
|
+
|
151
|
+
modes.never = {
|
152
|
+
"Program": function(node) {
|
153
|
+
report(getUseStrictDirectives(node.body), messages.never);
|
154
|
+
},
|
155
|
+
"FunctionDeclaration": function(node) {
|
156
|
+
report(getUseStrictDirectives(node.body.body), messages.never);
|
157
|
+
},
|
158
|
+
"FunctionExpression": function(node) {
|
159
|
+
report(getUseStrictDirectives(node.body.body), messages.never);
|
160
|
+
}
|
161
|
+
};
|
162
|
+
|
163
|
+
//--------------------------------------------------------------------------
|
164
|
+
// "global" mode
|
165
|
+
//--------------------------------------------------------------------------
|
166
|
+
|
167
|
+
modes.global = {
|
168
|
+
"Program": function(node) {
|
169
|
+
var useStrictDirectives = getUseStrictDirectives(node.body);
|
170
|
+
|
171
|
+
if (!isModule && node.body.length && useStrictDirectives.length < 1) {
|
172
|
+
report(node, messages.global);
|
173
|
+
} else if (isModule) {
|
174
|
+
report(useStrictDirectives, messages.unnecessary);
|
175
|
+
} else {
|
176
|
+
report(useStrictDirectives.slice(1), messages.multiple);
|
177
|
+
}
|
178
|
+
},
|
179
|
+
"FunctionDeclaration": function(node) {
|
180
|
+
report(getUseStrictDirectives(node.body.body), messages.global);
|
181
|
+
},
|
182
|
+
"FunctionExpression": function(node) {
|
183
|
+
report(getUseStrictDirectives(node.body.body), messages.global);
|
184
|
+
}
|
185
|
+
};
|
186
|
+
|
187
|
+
//--------------------------------------------------------------------------
|
188
|
+
// "function" mode
|
189
|
+
//--------------------------------------------------------------------------
|
190
|
+
|
191
|
+
/**
|
192
|
+
* Entering a function pushes a new nested scope onto the stack. The new
|
193
|
+
* scope is true if the nested function is strict mode code.
|
194
|
+
* @param {ASTNode} node The function declaration or expression.
|
195
|
+
* @returns {void}
|
196
|
+
*/
|
197
|
+
function enterFunction(node) {
|
198
|
+
var useStrictDirectives = getUseStrictDirectives(node.body.body),
|
199
|
+
isParentGlobal = scopes.length === 0,
|
200
|
+
isParentStrict = isModule || (scopes.length && scopes[scopes.length - 1]),
|
201
|
+
isStrict = useStrictDirectives.length > 0 || isModule;
|
202
|
+
|
203
|
+
if (isStrict) {
|
204
|
+
if (isParentStrict && useStrictDirectives.length) {
|
205
|
+
report(useStrictDirectives[0], messages.unnecessary);
|
206
|
+
}
|
207
|
+
|
208
|
+
report(useStrictDirectives.slice(1), messages.multiple);
|
209
|
+
} else if (isParentGlobal && !isModule) {
|
210
|
+
report(node, messages.function);
|
211
|
+
}
|
212
|
+
|
213
|
+
scopes.push(isParentStrict || isStrict);
|
214
|
+
}
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Exiting a function pops its scope off the stack.
|
218
|
+
* @returns {void}
|
219
|
+
*/
|
220
|
+
function exitFunction() {
|
221
|
+
scopes.pop();
|
222
|
+
}
|
223
|
+
|
224
|
+
modes.function = {
|
225
|
+
"Program": function(node) {
|
226
|
+
report(getUseStrictDirectives(node.body), messages.function);
|
227
|
+
},
|
228
|
+
"FunctionDeclaration": enterFunction,
|
229
|
+
"FunctionExpression": enterFunction,
|
230
|
+
"FunctionDeclaration:exit": exitFunction,
|
231
|
+
"FunctionExpression:exit": exitFunction
|
232
|
+
};
|
233
|
+
|
234
|
+
return modes[mode || "deprecated"];
|
235
|
+
|
236
|
+
};
|
237
|
+
|
238
|
+
module.exports.schema = [
|
239
|
+
{
|
240
|
+
"enum": ["never", "global", "function"]
|
241
|
+
}
|
242
|
+
];
|
package/lib/rules/use-isnan.js
CHANGED
@@ -1,26 +1,26 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Rule to flag comparisons to the value NaN
|
3
|
-
* @author James Allardice
|
4
|
-
* @copyright 2014 Jordan Harband. All rights reserved.
|
5
|
-
* @copyright 2013 James Allardice. All rights reserved.
|
6
|
-
*/
|
7
|
-
|
8
|
-
"use strict";
|
9
|
-
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
// Rule Definition
|
12
|
-
//------------------------------------------------------------------------------
|
13
|
-
|
14
|
-
module.exports = function (context) {
|
15
|
-
|
16
|
-
return {
|
17
|
-
"BinaryExpression": function (node) {
|
18
|
-
if (/^(?:[<>]|[!=]=)=?$/.test(node.operator) && (node.left.name === "NaN" || node.right.name === "NaN")) {
|
19
|
-
context.report(node, "Use the isNaN function to compare with NaN.");
|
20
|
-
}
|
21
|
-
}
|
22
|
-
};
|
23
|
-
|
24
|
-
};
|
25
|
-
|
26
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Rule to flag comparisons to the value NaN
|
3
|
+
* @author James Allardice
|
4
|
+
* @copyright 2014 Jordan Harband. All rights reserved.
|
5
|
+
* @copyright 2013 James Allardice. All rights reserved.
|
6
|
+
*/
|
7
|
+
|
8
|
+
"use strict";
|
9
|
+
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
// Rule Definition
|
12
|
+
//------------------------------------------------------------------------------
|
13
|
+
|
14
|
+
module.exports = function (context) {
|
15
|
+
|
16
|
+
return {
|
17
|
+
"BinaryExpression": function (node) {
|
18
|
+
if (/^(?:[<>]|[!=]=)=?$/.test(node.operator) && (node.left.name === "NaN" || node.right.name === "NaN")) {
|
19
|
+
context.report(node, "Use the isNaN function to compare with NaN.");
|
20
|
+
}
|
21
|
+
}
|
22
|
+
};
|
23
|
+
|
24
|
+
};
|
25
|
+
|
26
|
+
module.exports.schema = [];
|