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/valid-jsdoc.js
CHANGED
@@ -1,215 +1,215 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Validates JSDoc comments are syntactically correct
|
3
|
-
* @author Nicholas C. Zakas
|
4
|
-
* @copyright 2014 Nicholas C. Zakas. All rights reserved.
|
5
|
-
*/
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Requirements
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
var doctrine = require("doctrine");
|
13
|
-
|
14
|
-
//------------------------------------------------------------------------------
|
15
|
-
// Rule Definition
|
16
|
-
//------------------------------------------------------------------------------
|
17
|
-
|
18
|
-
module.exports = function(context) {
|
19
|
-
|
20
|
-
var options = context.options[0] || {},
|
21
|
-
prefer = options.prefer || {},
|
22
|
-
|
23
|
-
// these both default to true, so you have to explicitly make them false
|
24
|
-
requireReturn = options.requireReturn !== false,
|
25
|
-
requireParamDescription = options.requireParamDescription !== false,
|
26
|
-
requireReturnDescription = options.requireReturnDescription !== false;
|
27
|
-
|
28
|
-
//--------------------------------------------------------------------------
|
29
|
-
// Helpers
|
30
|
-
//--------------------------------------------------------------------------
|
31
|
-
|
32
|
-
// Using a stack to store if a function returns or not (handling nested functions)
|
33
|
-
var fns = [];
|
34
|
-
|
35
|
-
/**
|
36
|
-
* When parsing a new function, store it in our function stack.
|
37
|
-
* @returns {void}
|
38
|
-
* @private
|
39
|
-
*/
|
40
|
-
function startFunction() {
|
41
|
-
fns.push({returnPresent: false});
|
42
|
-
}
|
43
|
-
|
44
|
-
/**
|
45
|
-
* Indicate that return has been found in the current function.
|
46
|
-
* @param {ASTNode} node The return node.
|
47
|
-
* @returns {void}
|
48
|
-
* @private
|
49
|
-
*/
|
50
|
-
function addReturn(node) {
|
51
|
-
var functionState = fns[fns.length - 1];
|
52
|
-
|
53
|
-
if (functionState && node.argument !== null) {
|
54
|
-
functionState.returnPresent = true;
|
55
|
-
}
|
56
|
-
}
|
57
|
-
|
58
|
-
/**
|
59
|
-
* Validate the JSDoc node and output warnings if anything is wrong.
|
60
|
-
* @param {ASTNode} node The AST node to check.
|
61
|
-
* @returns {void}
|
62
|
-
* @private
|
63
|
-
*/
|
64
|
-
function checkJSDoc(node) {
|
65
|
-
var jsdocNode = context.getJSDocComment(node),
|
66
|
-
functionData = fns.pop(),
|
67
|
-
hasReturns = false,
|
68
|
-
hasConstructor = false,
|
69
|
-
params = Object.create(null),
|
70
|
-
jsdoc;
|
71
|
-
|
72
|
-
// make sure only to validate JSDoc comments
|
73
|
-
if (jsdocNode) {
|
74
|
-
|
75
|
-
try {
|
76
|
-
jsdoc = doctrine.parse(jsdocNode.value, {
|
77
|
-
strict: true,
|
78
|
-
unwrap: true,
|
79
|
-
sloppy: true
|
80
|
-
});
|
81
|
-
} catch (ex) {
|
82
|
-
|
83
|
-
if (/braces/i.test(ex.message)) {
|
84
|
-
context.report(jsdocNode, "JSDoc type missing brace.");
|
85
|
-
} else {
|
86
|
-
context.report(jsdocNode, "JSDoc syntax error.");
|
87
|
-
}
|
88
|
-
|
89
|
-
return;
|
90
|
-
}
|
91
|
-
|
92
|
-
jsdoc.tags.forEach(function(tag) {
|
93
|
-
|
94
|
-
switch (tag.title) {
|
95
|
-
|
96
|
-
case "param":
|
97
|
-
if (!tag.type) {
|
98
|
-
context.report(jsdocNode, "Missing JSDoc parameter type for '{{name}}'.", { name: tag.name });
|
99
|
-
}
|
100
|
-
|
101
|
-
if (!tag.description && requireParamDescription) {
|
102
|
-
context.report(jsdocNode, "Missing JSDoc parameter description for '{{name}}'.", { name: tag.name });
|
103
|
-
}
|
104
|
-
|
105
|
-
if (params[tag.name]) {
|
106
|
-
context.report(jsdocNode, "Duplicate JSDoc parameter '{{name}}'.", { name: tag.name });
|
107
|
-
} else if (tag.name.indexOf(".") === -1) {
|
108
|
-
params[tag.name] = 1;
|
109
|
-
}
|
110
|
-
break;
|
111
|
-
|
112
|
-
case "return":
|
113
|
-
case "returns":
|
114
|
-
hasReturns = true;
|
115
|
-
|
116
|
-
if (!requireReturn && !functionData.returnPresent && tag.type.name !== "void" && tag.type.name !== "undefined") {
|
117
|
-
context.report(jsdocNode, "Unexpected @" + tag.title + " tag; function has no return statement.");
|
118
|
-
} else {
|
119
|
-
if (!tag.type) {
|
120
|
-
context.report(jsdocNode, "Missing JSDoc return type.");
|
121
|
-
}
|
122
|
-
|
123
|
-
if (tag.type.name !== "void" && !tag.description && requireReturnDescription) {
|
124
|
-
context.report(jsdocNode, "Missing JSDoc return description.");
|
125
|
-
}
|
126
|
-
}
|
127
|
-
|
128
|
-
break;
|
129
|
-
|
130
|
-
case "constructor":
|
131
|
-
case "class":
|
132
|
-
hasConstructor = true;
|
133
|
-
break;
|
134
|
-
|
135
|
-
// no default
|
136
|
-
}
|
137
|
-
|
138
|
-
// check tag preferences
|
139
|
-
if (prefer.hasOwnProperty(tag.title)) {
|
140
|
-
context.report(jsdocNode, "Use @{{name}} instead.", { name: prefer[tag.title] });
|
141
|
-
}
|
142
|
-
|
143
|
-
});
|
144
|
-
|
145
|
-
// check for functions missing @returns
|
146
|
-
if (!hasReturns && !hasConstructor) {
|
147
|
-
if (requireReturn || functionData.returnPresent) {
|
148
|
-
context.report(jsdocNode, "Missing JSDoc @returns for function.");
|
149
|
-
}
|
150
|
-
}
|
151
|
-
|
152
|
-
// check the parameters
|
153
|
-
var jsdocParams = Object.keys(params);
|
154
|
-
|
155
|
-
node.params.forEach(function(param, i) {
|
156
|
-
var name = param.name;
|
157
|
-
|
158
|
-
// TODO(nzakas): Figure out logical things to do with destructured, default, rest params
|
159
|
-
if (param.type === "Identifier") {
|
160
|
-
if (jsdocParams[i] && (name !== jsdocParams[i])) {
|
161
|
-
context.report(jsdocNode, "Expected JSDoc for '{{name}}' but found '{{jsdocName}}'.", {
|
162
|
-
name: name,
|
163
|
-
jsdocName: jsdocParams[i]
|
164
|
-
});
|
165
|
-
} else if (!params[name]) {
|
166
|
-
context.report(jsdocNode, "Missing JSDoc for parameter '{{name}}'.", {
|
167
|
-
name: name
|
168
|
-
});
|
169
|
-
}
|
170
|
-
}
|
171
|
-
});
|
172
|
-
|
173
|
-
}
|
174
|
-
|
175
|
-
}
|
176
|
-
|
177
|
-
//--------------------------------------------------------------------------
|
178
|
-
// Public
|
179
|
-
//--------------------------------------------------------------------------
|
180
|
-
|
181
|
-
return {
|
182
|
-
"ArrowFunctionExpression": startFunction,
|
183
|
-
"FunctionExpression": startFunction,
|
184
|
-
"FunctionDeclaration": startFunction,
|
185
|
-
"ArrowFunctionExpression:exit": checkJSDoc,
|
186
|
-
"FunctionExpression:exit": checkJSDoc,
|
187
|
-
"FunctionDeclaration:exit": checkJSDoc,
|
188
|
-
"ReturnStatement": addReturn
|
189
|
-
};
|
190
|
-
|
191
|
-
};
|
192
|
-
|
193
|
-
module.exports.schema = [
|
194
|
-
{
|
195
|
-
"type": "object",
|
196
|
-
"properties": {
|
197
|
-
"prefer": {
|
198
|
-
"type": "object",
|
199
|
-
"additionalProperties": {
|
200
|
-
"type": "string"
|
201
|
-
}
|
202
|
-
},
|
203
|
-
"requireReturn": {
|
204
|
-
"type": "boolean"
|
205
|
-
},
|
206
|
-
"requireParamDescription": {
|
207
|
-
"type": "boolean"
|
208
|
-
},
|
209
|
-
"requireReturnDescription": {
|
210
|
-
"type": "boolean"
|
211
|
-
}
|
212
|
-
},
|
213
|
-
"additionalProperties": false
|
214
|
-
}
|
215
|
-
];
|
1
|
+
/**
|
2
|
+
* @fileoverview Validates JSDoc comments are syntactically correct
|
3
|
+
* @author Nicholas C. Zakas
|
4
|
+
* @copyright 2014 Nicholas C. Zakas. All rights reserved.
|
5
|
+
*/
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Requirements
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
var doctrine = require("doctrine");
|
13
|
+
|
14
|
+
//------------------------------------------------------------------------------
|
15
|
+
// Rule Definition
|
16
|
+
//------------------------------------------------------------------------------
|
17
|
+
|
18
|
+
module.exports = function(context) {
|
19
|
+
|
20
|
+
var options = context.options[0] || {},
|
21
|
+
prefer = options.prefer || {},
|
22
|
+
|
23
|
+
// these both default to true, so you have to explicitly make them false
|
24
|
+
requireReturn = options.requireReturn !== false,
|
25
|
+
requireParamDescription = options.requireParamDescription !== false,
|
26
|
+
requireReturnDescription = options.requireReturnDescription !== false;
|
27
|
+
|
28
|
+
//--------------------------------------------------------------------------
|
29
|
+
// Helpers
|
30
|
+
//--------------------------------------------------------------------------
|
31
|
+
|
32
|
+
// Using a stack to store if a function returns or not (handling nested functions)
|
33
|
+
var fns = [];
|
34
|
+
|
35
|
+
/**
|
36
|
+
* When parsing a new function, store it in our function stack.
|
37
|
+
* @returns {void}
|
38
|
+
* @private
|
39
|
+
*/
|
40
|
+
function startFunction() {
|
41
|
+
fns.push({returnPresent: false});
|
42
|
+
}
|
43
|
+
|
44
|
+
/**
|
45
|
+
* Indicate that return has been found in the current function.
|
46
|
+
* @param {ASTNode} node The return node.
|
47
|
+
* @returns {void}
|
48
|
+
* @private
|
49
|
+
*/
|
50
|
+
function addReturn(node) {
|
51
|
+
var functionState = fns[fns.length - 1];
|
52
|
+
|
53
|
+
if (functionState && node.argument !== null) {
|
54
|
+
functionState.returnPresent = true;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* Validate the JSDoc node and output warnings if anything is wrong.
|
60
|
+
* @param {ASTNode} node The AST node to check.
|
61
|
+
* @returns {void}
|
62
|
+
* @private
|
63
|
+
*/
|
64
|
+
function checkJSDoc(node) {
|
65
|
+
var jsdocNode = context.getJSDocComment(node),
|
66
|
+
functionData = fns.pop(),
|
67
|
+
hasReturns = false,
|
68
|
+
hasConstructor = false,
|
69
|
+
params = Object.create(null),
|
70
|
+
jsdoc;
|
71
|
+
|
72
|
+
// make sure only to validate JSDoc comments
|
73
|
+
if (jsdocNode) {
|
74
|
+
|
75
|
+
try {
|
76
|
+
jsdoc = doctrine.parse(jsdocNode.value, {
|
77
|
+
strict: true,
|
78
|
+
unwrap: true,
|
79
|
+
sloppy: true
|
80
|
+
});
|
81
|
+
} catch (ex) {
|
82
|
+
|
83
|
+
if (/braces/i.test(ex.message)) {
|
84
|
+
context.report(jsdocNode, "JSDoc type missing brace.");
|
85
|
+
} else {
|
86
|
+
context.report(jsdocNode, "JSDoc syntax error.");
|
87
|
+
}
|
88
|
+
|
89
|
+
return;
|
90
|
+
}
|
91
|
+
|
92
|
+
jsdoc.tags.forEach(function(tag) {
|
93
|
+
|
94
|
+
switch (tag.title) {
|
95
|
+
|
96
|
+
case "param":
|
97
|
+
if (!tag.type) {
|
98
|
+
context.report(jsdocNode, "Missing JSDoc parameter type for '{{name}}'.", { name: tag.name });
|
99
|
+
}
|
100
|
+
|
101
|
+
if (!tag.description && requireParamDescription) {
|
102
|
+
context.report(jsdocNode, "Missing JSDoc parameter description for '{{name}}'.", { name: tag.name });
|
103
|
+
}
|
104
|
+
|
105
|
+
if (params[tag.name]) {
|
106
|
+
context.report(jsdocNode, "Duplicate JSDoc parameter '{{name}}'.", { name: tag.name });
|
107
|
+
} else if (tag.name.indexOf(".") === -1) {
|
108
|
+
params[tag.name] = 1;
|
109
|
+
}
|
110
|
+
break;
|
111
|
+
|
112
|
+
case "return":
|
113
|
+
case "returns":
|
114
|
+
hasReturns = true;
|
115
|
+
|
116
|
+
if (!requireReturn && !functionData.returnPresent && tag.type.name !== "void" && tag.type.name !== "undefined") {
|
117
|
+
context.report(jsdocNode, "Unexpected @" + tag.title + " tag; function has no return statement.");
|
118
|
+
} else {
|
119
|
+
if (!tag.type) {
|
120
|
+
context.report(jsdocNode, "Missing JSDoc return type.");
|
121
|
+
}
|
122
|
+
|
123
|
+
if (tag.type.name !== "void" && !tag.description && requireReturnDescription) {
|
124
|
+
context.report(jsdocNode, "Missing JSDoc return description.");
|
125
|
+
}
|
126
|
+
}
|
127
|
+
|
128
|
+
break;
|
129
|
+
|
130
|
+
case "constructor":
|
131
|
+
case "class":
|
132
|
+
hasConstructor = true;
|
133
|
+
break;
|
134
|
+
|
135
|
+
// no default
|
136
|
+
}
|
137
|
+
|
138
|
+
// check tag preferences
|
139
|
+
if (prefer.hasOwnProperty(tag.title)) {
|
140
|
+
context.report(jsdocNode, "Use @{{name}} instead.", { name: prefer[tag.title] });
|
141
|
+
}
|
142
|
+
|
143
|
+
});
|
144
|
+
|
145
|
+
// check for functions missing @returns
|
146
|
+
if (!hasReturns && !hasConstructor && node.parent.kind !== "get") {
|
147
|
+
if (requireReturn || functionData.returnPresent) {
|
148
|
+
context.report(jsdocNode, "Missing JSDoc @returns for function.");
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
152
|
+
// check the parameters
|
153
|
+
var jsdocParams = Object.keys(params);
|
154
|
+
|
155
|
+
node.params.forEach(function(param, i) {
|
156
|
+
var name = param.name;
|
157
|
+
|
158
|
+
// TODO(nzakas): Figure out logical things to do with destructured, default, rest params
|
159
|
+
if (param.type === "Identifier") {
|
160
|
+
if (jsdocParams[i] && (name !== jsdocParams[i])) {
|
161
|
+
context.report(jsdocNode, "Expected JSDoc for '{{name}}' but found '{{jsdocName}}'.", {
|
162
|
+
name: name,
|
163
|
+
jsdocName: jsdocParams[i]
|
164
|
+
});
|
165
|
+
} else if (!params[name]) {
|
166
|
+
context.report(jsdocNode, "Missing JSDoc for parameter '{{name}}'.", {
|
167
|
+
name: name
|
168
|
+
});
|
169
|
+
}
|
170
|
+
}
|
171
|
+
});
|
172
|
+
|
173
|
+
}
|
174
|
+
|
175
|
+
}
|
176
|
+
|
177
|
+
//--------------------------------------------------------------------------
|
178
|
+
// Public
|
179
|
+
//--------------------------------------------------------------------------
|
180
|
+
|
181
|
+
return {
|
182
|
+
"ArrowFunctionExpression": startFunction,
|
183
|
+
"FunctionExpression": startFunction,
|
184
|
+
"FunctionDeclaration": startFunction,
|
185
|
+
"ArrowFunctionExpression:exit": checkJSDoc,
|
186
|
+
"FunctionExpression:exit": checkJSDoc,
|
187
|
+
"FunctionDeclaration:exit": checkJSDoc,
|
188
|
+
"ReturnStatement": addReturn
|
189
|
+
};
|
190
|
+
|
191
|
+
};
|
192
|
+
|
193
|
+
module.exports.schema = [
|
194
|
+
{
|
195
|
+
"type": "object",
|
196
|
+
"properties": {
|
197
|
+
"prefer": {
|
198
|
+
"type": "object",
|
199
|
+
"additionalProperties": {
|
200
|
+
"type": "string"
|
201
|
+
}
|
202
|
+
},
|
203
|
+
"requireReturn": {
|
204
|
+
"type": "boolean"
|
205
|
+
},
|
206
|
+
"requireParamDescription": {
|
207
|
+
"type": "boolean"
|
208
|
+
},
|
209
|
+
"requireReturnDescription": {
|
210
|
+
"type": "boolean"
|
211
|
+
}
|
212
|
+
},
|
213
|
+
"additionalProperties": false
|
214
|
+
}
|
215
|
+
];
|
@@ -1,42 +1,42 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Ensures that the results of typeof are compared against a valid string
|
3
|
-
* @author Ian Christian Myers
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
//------------------------------------------------------------------------------
|
8
|
-
// Rule Definition
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
|
11
|
-
module.exports = function(context) {
|
12
|
-
|
13
|
-
var VALID_TYPES = ["symbol", "undefined", "object", "boolean", "number", "string", "function"],
|
14
|
-
OPERATORS = ["==", "===", "!=", "!=="];
|
15
|
-
|
16
|
-
//--------------------------------------------------------------------------
|
17
|
-
// Public
|
18
|
-
//--------------------------------------------------------------------------
|
19
|
-
|
20
|
-
return {
|
21
|
-
|
22
|
-
"UnaryExpression": function (node) {
|
23
|
-
var parent, sibling;
|
24
|
-
|
25
|
-
if (node.operator === "typeof") {
|
26
|
-
parent = context.getAncestors().pop();
|
27
|
-
|
28
|
-
if (parent.type === "BinaryExpression" && OPERATORS.indexOf(parent.operator) !== -1) {
|
29
|
-
sibling = parent.left === node ? parent.right : parent.left;
|
30
|
-
|
31
|
-
if (sibling.type === "Literal" && VALID_TYPES.indexOf(sibling.value) === -1) {
|
32
|
-
context.report(sibling, "Invalid typeof comparison value");
|
33
|
-
}
|
34
|
-
}
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
|
-
};
|
39
|
-
|
40
|
-
};
|
41
|
-
|
42
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Ensures that the results of typeof are compared against a valid string
|
3
|
+
* @author Ian Christian Myers
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
//------------------------------------------------------------------------------
|
8
|
+
// Rule Definition
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
|
11
|
+
module.exports = function(context) {
|
12
|
+
|
13
|
+
var VALID_TYPES = ["symbol", "undefined", "object", "boolean", "number", "string", "function"],
|
14
|
+
OPERATORS = ["==", "===", "!=", "!=="];
|
15
|
+
|
16
|
+
//--------------------------------------------------------------------------
|
17
|
+
// Public
|
18
|
+
//--------------------------------------------------------------------------
|
19
|
+
|
20
|
+
return {
|
21
|
+
|
22
|
+
"UnaryExpression": function (node) {
|
23
|
+
var parent, sibling;
|
24
|
+
|
25
|
+
if (node.operator === "typeof") {
|
26
|
+
parent = context.getAncestors().pop();
|
27
|
+
|
28
|
+
if (parent.type === "BinaryExpression" && OPERATORS.indexOf(parent.operator) !== -1) {
|
29
|
+
sibling = parent.left === node ? parent.right : parent.left;
|
30
|
+
|
31
|
+
if (sibling.type === "Literal" && VALID_TYPES.indexOf(sibling.value) === -1) {
|
32
|
+
context.report(sibling, "Invalid typeof comparison value");
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
};
|
39
|
+
|
40
|
+
};
|
41
|
+
|
42
|
+
module.exports.schema = [];
|