eslint-plugin-jsdoc 44.2.3 → 44.2.5
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/dist/WarnSettings.js +0 -1
- package/dist/WarnSettings.js.map +1 -1
- package/dist/alignTransform.js +87 -5
- package/dist/alignTransform.js.map +1 -1
- package/dist/bin/generateRule.js +4 -3
- package/dist/bin/generateRule.js.map +1 -1
- package/dist/exportParser.js +272 -71
- package/dist/exportParser.js.map +1 -1
- package/dist/generateRule.js +4 -3
- package/dist/generateRule.js.map +1 -1
- package/dist/iterateJsdoc.js +921 -357
- package/dist/iterateJsdoc.js.map +1 -1
- package/dist/jsdocUtils.js +270 -168
- package/dist/jsdocUtils.js.map +1 -1
- package/dist/rules/checkAlignment.js +6 -0
- package/dist/rules/checkAlignment.js.map +1 -1
- package/dist/rules/checkExamples.js +73 -9
- package/dist/rules/checkExamples.js.map +1 -1
- package/dist/rules/checkIndentation.js +12 -2
- package/dist/rules/checkIndentation.js.map +1 -1
- package/dist/rules/checkLineAlignment.js +71 -7
- package/dist/rules/checkLineAlignment.js.map +1 -1
- package/dist/rules/checkParamNames.js +29 -11
- package/dist/rules/checkParamNames.js.map +1 -1
- package/dist/rules/checkPropertyNames.js +13 -7
- package/dist/rules/checkPropertyNames.js.map +1 -1
- package/dist/rules/checkTagNames.js +45 -9
- package/dist/rules/checkTagNames.js.map +1 -1
- package/dist/rules/checkTypes.js +98 -41
- package/dist/rules/checkTypes.js.map +1 -1
- package/dist/rules/checkValues.js +7 -7
- package/dist/rules/checkValues.js.map +1 -1
- package/dist/rules/emptyTags.js +8 -1
- package/dist/rules/emptyTags.js.map +1 -1
- package/dist/rules/informativeDocs.js +27 -8
- package/dist/rules/informativeDocs.js.map +1 -1
- package/dist/rules/matchDescription.js +18 -1
- package/dist/rules/matchDescription.js.map +1 -1
- package/dist/rules/matchName.js +2 -2
- package/dist/rules/matchName.js.map +1 -1
- package/dist/rules/multilineBlocks.js +12 -1
- package/dist/rules/multilineBlocks.js.map +1 -1
- package/dist/rules/noBadBlocks.js +4 -6
- package/dist/rules/noBadBlocks.js.map +1 -1
- package/dist/rules/noBlankBlockDescriptions.js +2 -0
- package/dist/rules/noBlankBlockDescriptions.js.map +1 -1
- package/dist/rules/noMissingSyntax.js +53 -16
- package/dist/rules/noMissingSyntax.js.map +1 -1
- package/dist/rules/noMultiAsterisks.js +1 -6
- package/dist/rules/noMultiAsterisks.js.map +1 -1
- package/dist/rules/noRestrictedSyntax.js +12 -5
- package/dist/rules/noRestrictedSyntax.js.map +1 -1
- package/dist/rules/noTypes.js +3 -0
- package/dist/rules/noTypes.js.map +1 -1
- package/dist/rules/noUndefinedTypes.js +65 -27
- package/dist/rules/noUndefinedTypes.js.map +1 -1
- package/dist/rules/requireAsteriskPrefix.js +20 -0
- package/dist/rules/requireAsteriskPrefix.js.map +1 -1
- package/dist/rules/requireDescription.js +6 -2
- package/dist/rules/requireDescription.js.map +1 -1
- package/dist/rules/requireDescriptionCompleteSentence.js +75 -12
- package/dist/rules/requireDescriptionCompleteSentence.js.map +1 -1
- package/dist/rules/requireFileOverview.js +9 -4
- package/dist/rules/requireFileOverview.js.map +1 -1
- package/dist/rules/requireHyphenBeforeParamDescription.js +21 -7
- package/dist/rules/requireHyphenBeforeParamDescription.js.map +1 -1
- package/dist/rules/requireJsdoc.js +150 -29
- package/dist/rules/requireJsdoc.js.map +1 -1
- package/dist/rules/requireParam.js +116 -10
- package/dist/rules/requireParam.js.map +1 -1
- package/dist/rules/requireProperty.js +1 -1
- package/dist/rules/requireProperty.js.map +1 -1
- package/dist/rules/requireReturns.js +2 -3
- package/dist/rules/requireReturns.js.map +1 -1
- package/dist/rules/requireReturnsCheck.js +9 -2
- package/dist/rules/requireReturnsCheck.js.map +1 -1
- package/dist/rules/requireThrows.js +2 -3
- package/dist/rules/requireThrows.js.map +1 -1
- package/dist/rules/requireYields.js +9 -3
- package/dist/rules/requireYields.js.map +1 -1
- package/dist/rules/requireYieldsCheck.js +19 -5
- package/dist/rules/requireYieldsCheck.js.map +1 -1
- package/dist/rules/sortTags.js +67 -9
- package/dist/rules/sortTags.js.map +1 -1
- package/dist/rules/tagLines.js +22 -3
- package/dist/rules/tagLines.js.map +1 -1
- package/dist/rules/textEscaping.js +18 -4
- package/dist/rules/textEscaping.js.map +1 -1
- package/dist/rules/validTypes.js +26 -9
- package/dist/rules/validTypes.js.map +1 -1
- package/dist/tagNames.js +0 -2
- package/dist/tagNames.js.map +1 -1
- package/dist/utils/hasReturnValue.js +77 -48
- package/dist/utils/hasReturnValue.js.map +1 -1
- package/docs/rules/check-line-alignment.md +7 -0
- package/docs/rules/check-tag-names.md +15 -0
- package/docs/rules/no-missing-syntax.md +6 -0
- package/docs/rules/no-undefined-types.md +6 -0
- package/docs/rules/require-description-complete-sentence.md +525 -289
- package/docs/rules/require-description.md +289 -525
- package/docs/rules/require-file-overview.md +7 -0
- package/docs/rules/require-jsdoc.md +1 -1
- package/docs/rules/require-param-description.md +116 -1694
- package/docs/rules/require-param-name.md +58 -133
- package/docs/rules/require-param-type.md +119 -55
- package/docs/rules/require-param.md +1704 -111
- package/docs/rules/require-property-description.md +39 -79
- package/docs/rules/require-property-name.md +21 -30
- package/docs/rules/require-property-type.md +21 -21
- package/docs/rules/require-property.md +82 -33
- package/docs/rules/require-returns-check.md +636 -747
- package/docs/rules/require-returns-description.md +61 -933
- package/docs/rules/require-returns-type.md +42 -79
- package/docs/rules/require-returns.md +1081 -61
- package/docs/rules/require-yields-check.md +238 -517
- package/docs/rules/require-yields.md +517 -238
- package/docs/rules/valid-types.md +1 -1
- package/docs/settings.md +3 -1
- package/package.json +10 -9
- package/tsconfig.json +2 -3
|
@@ -4,40 +4,37 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.hasValueOrExecutorHasNonEmptyResolveValue = exports.hasReturnValue = void 0;
|
|
7
|
-
/* eslint-disable jsdoc/no-undefined-types */
|
|
8
|
-
|
|
9
7
|
/**
|
|
10
8
|
* @typedef {import('estree').Node|
|
|
11
|
-
* import('@typescript-eslint/types').TSESTree.
|
|
9
|
+
* import('@typescript-eslint/types').TSESTree.Node} ESTreeOrTypeScriptNode
|
|
12
10
|
*/
|
|
13
11
|
|
|
14
12
|
/**
|
|
15
13
|
* Checks if a node is a promise but has no resolve value or an empty value.
|
|
16
14
|
* An `undefined` resolve does not count.
|
|
17
|
-
*
|
|
18
|
-
* @
|
|
19
|
-
* @returns {boolean}
|
|
15
|
+
* @param {ESTreeOrTypeScriptNode|undefined|null} node
|
|
16
|
+
* @returns {boolean|undefined|null}
|
|
20
17
|
*/
|
|
21
18
|
const isNewPromiseExpression = node => {
|
|
22
19
|
return node && node.type === 'NewExpression' && node.callee.type === 'Identifier' && node.callee.name === 'Promise';
|
|
23
20
|
};
|
|
24
21
|
|
|
25
22
|
/**
|
|
26
|
-
* @param {
|
|
23
|
+
* @param {ESTreeOrTypeScriptNode|null|undefined} node
|
|
27
24
|
* @returns {boolean}
|
|
28
25
|
*/
|
|
29
26
|
const isVoidPromise = node => {
|
|
30
27
|
var _node$typeParameters, _node$typeParameters$, _node$typeParameters$2;
|
|
31
|
-
return (node === null || node === void 0 ? void 0 : (_node$typeParameters = node.typeParameters) === null || _node$typeParameters === void 0 ? void 0 : (_node$typeParameters$ = _node$typeParameters.params) === null || _node$typeParameters$ === void 0 ? void 0 : (_node$typeParameters$2 = _node$typeParameters$[0]) === null || _node$typeParameters$2 === void 0 ? void 0 : _node$typeParameters$2.type) === 'TSVoidKeyword'
|
|
28
|
+
return (/** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */(node === null || node === void 0 ? void 0 : (_node$typeParameters = node.typeParameters) === null || _node$typeParameters === void 0 ? void 0 : (_node$typeParameters$ = _node$typeParameters.params) === null || _node$typeParameters$ === void 0 ? void 0 : (_node$typeParameters$2 = _node$typeParameters$[0]) === null || _node$typeParameters$2 === void 0 ? void 0 : _node$typeParameters$2.type) === 'TSVoidKeyword'
|
|
29
|
+
);
|
|
32
30
|
};
|
|
33
31
|
const undefinedKeywords = new Set(['TSVoidKeyword', 'TSUndefinedKeyword', 'TSNeverKeyword']);
|
|
34
32
|
|
|
35
33
|
/**
|
|
36
34
|
* Checks if a node has a return statement. Void return does not count.
|
|
37
|
-
*
|
|
38
|
-
* @param {
|
|
39
|
-
* @param {
|
|
40
|
-
* @param {PromiseFilter} promFilter
|
|
35
|
+
* @param {ESTreeOrTypeScriptNode|undefined|null} node
|
|
36
|
+
* @param {boolean} [throwOnNullReturn]
|
|
37
|
+
* @param {PromiseFilter} [promFilter]
|
|
41
38
|
* @returns {boolean|undefined}
|
|
42
39
|
*/
|
|
43
40
|
// eslint-disable-next-line complexity
|
|
@@ -119,10 +116,9 @@ const hasReturnValue = (node, throwOnNullReturn, promFilter) => {
|
|
|
119
116
|
|
|
120
117
|
/**
|
|
121
118
|
* Checks if a node has a return statement. Void return does not count.
|
|
122
|
-
*
|
|
123
|
-
* @param {object} node
|
|
119
|
+
* @param {ESTreeOrTypeScriptNode|null|undefined} node
|
|
124
120
|
* @param {PromiseFilter} promFilter
|
|
125
|
-
* @returns {boolean|
|
|
121
|
+
* @returns {undefined|boolean|ESTreeOrTypeScriptNode}
|
|
126
122
|
*/
|
|
127
123
|
// eslint-disable-next-line complexity
|
|
128
124
|
exports.hasReturnValue = hasReturnValue;
|
|
@@ -146,7 +142,8 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
|
|
|
146
142
|
case 'FunctionDeclaration':
|
|
147
143
|
case 'ArrowFunctionExpression':
|
|
148
144
|
{
|
|
149
|
-
return node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) || allBrancheshaveReturnValues(node.body, promFilter) ||
|
|
145
|
+
return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) || allBrancheshaveReturnValues(node.body, promFilter) || /** @type {import('@typescript-eslint/types').TSESTree.BlockStatement} */
|
|
146
|
+
node.body.body.some(nde => {
|
|
150
147
|
return nde.type === 'ReturnStatement';
|
|
151
148
|
});
|
|
152
149
|
}
|
|
@@ -157,7 +154,11 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
|
|
|
157
154
|
}
|
|
158
155
|
case 'WhileStatement':
|
|
159
156
|
case 'DoWhileStatement':
|
|
160
|
-
if (
|
|
157
|
+
if (
|
|
158
|
+
/**
|
|
159
|
+
* @type {import('@typescript-eslint/types').TSESTree.Literal}
|
|
160
|
+
*/
|
|
161
|
+
node.test.value === true) {
|
|
161
162
|
// If this is an infinite loop, we assume only one branch
|
|
162
163
|
// is needed to provide a return
|
|
163
164
|
return hasReturnValue(node.body, false, promFilter);
|
|
@@ -186,7 +187,7 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
|
|
|
186
187
|
hasReturnValue(node.finalizer, true, promFilter);
|
|
187
188
|
} catch (error) {
|
|
188
189
|
// istanbul ignore else
|
|
189
|
-
if (error.message === 'Null return') {
|
|
190
|
+
if ( /** @type {Error} */error.message === 'Null return') {
|
|
190
191
|
return false;
|
|
191
192
|
}
|
|
192
193
|
|
|
@@ -200,11 +201,12 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
|
|
|
200
201
|
}
|
|
201
202
|
case 'SwitchStatement':
|
|
202
203
|
{
|
|
203
|
-
return node.cases.every(someCase => {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
204
|
+
return (/** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */node.cases.every(someCase => {
|
|
205
|
+
return !someCase.consequent.some(consNode => {
|
|
206
|
+
return consNode.type === 'BreakStatement' || consNode.type === 'ReturnStatement' && consNode.argument === null;
|
|
207
|
+
});
|
|
208
|
+
})
|
|
209
|
+
);
|
|
208
210
|
}
|
|
209
211
|
case 'ThrowStatement':
|
|
210
212
|
{
|
|
@@ -232,7 +234,7 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
|
|
|
232
234
|
|
|
233
235
|
/**
|
|
234
236
|
* @callback PromiseFilter
|
|
235
|
-
* @param {
|
|
237
|
+
* @param {ESTreeOrTypeScriptNode|undefined} node
|
|
236
238
|
* @returns {boolean}
|
|
237
239
|
*/
|
|
238
240
|
|
|
@@ -244,8 +246,7 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
|
|
|
244
246
|
* This could check for redeclaration of the resolver, but as such is
|
|
245
247
|
* unlikely, we avoid the performance cost of checking everywhere for
|
|
246
248
|
* (re)declarations or assignments.
|
|
247
|
-
*
|
|
248
|
-
* @param {AST} node
|
|
249
|
+
* @param {import('@typescript-eslint/types').TSESTree.Node|null|undefined} node
|
|
249
250
|
* @param {string} resolverName
|
|
250
251
|
* @returns {boolean}
|
|
251
252
|
*/
|
|
@@ -257,17 +258,19 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
|
|
|
257
258
|
|
|
258
259
|
// Arrow function without block
|
|
259
260
|
switch (node.type) {
|
|
261
|
+
// @ts-expect-error Babel?
|
|
260
262
|
// istanbul ignore next -- In Babel?
|
|
261
263
|
case 'OptionalCallExpression':
|
|
262
264
|
case 'CallExpression':
|
|
263
|
-
return node.callee.name === resolverName && (
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
265
|
+
return (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */node.callee.name === resolverName && (
|
|
266
|
+
// Implicit or explicit undefined
|
|
267
|
+
node.arguments.length > 1 || node.arguments[0] !== undefined) || node.arguments.some(nde => {
|
|
268
|
+
// Being passed in to another function (which might invoke it)
|
|
269
|
+
return nde.type === 'Identifier' && nde.name === resolverName ||
|
|
270
|
+
// Handle nested items
|
|
271
|
+
hasNonEmptyResolverCall(nde, resolverName);
|
|
272
|
+
})
|
|
273
|
+
);
|
|
271
274
|
case 'ChainExpression':
|
|
272
275
|
case 'Decorator':
|
|
273
276
|
case 'ExpressionStatement':
|
|
@@ -283,7 +286,7 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
|
|
|
283
286
|
{
|
|
284
287
|
var _node$params$;
|
|
285
288
|
// Shadowing
|
|
286
|
-
if (((_node$params$ = node.params[0]) === null || _node$params$ === void 0 ? void 0 : _node$params$.name) === resolverName) {
|
|
289
|
+
if ( /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */((_node$params$ = node.params[0]) === null || _node$params$ === void 0 ? void 0 : _node$params$.name) === resolverName) {
|
|
287
290
|
return false;
|
|
288
291
|
}
|
|
289
292
|
return hasNonEmptyResolverCall(node.body, resolverName);
|
|
@@ -340,6 +343,7 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
|
|
|
340
343
|
return node.properties.some(property => {
|
|
341
344
|
return hasNonEmptyResolverCall(property, resolverName);
|
|
342
345
|
});
|
|
346
|
+
// @ts-expect-error Babel?
|
|
343
347
|
// istanbul ignore next -- In Babel?
|
|
344
348
|
case 'ClassMethod':
|
|
345
349
|
case 'MethodDefinition':
|
|
@@ -347,20 +351,26 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
|
|
|
347
351
|
return hasNonEmptyResolverCall(decorator, resolverName);
|
|
348
352
|
}) || node.computed && hasNonEmptyResolverCall(node.key, resolverName) || hasNonEmptyResolverCall(node.value, resolverName);
|
|
349
353
|
|
|
354
|
+
// @ts-expect-error Babel?
|
|
350
355
|
// istanbul ignore next -- In Babel?
|
|
351
356
|
case 'ObjectProperty':
|
|
352
357
|
/* eslint-disable no-fallthrough */
|
|
353
358
|
// istanbul ignore next -- In Babel?
|
|
354
359
|
case 'PropertyDefinition':
|
|
360
|
+
// @ts-expect-error Babel?
|
|
355
361
|
// istanbul ignore next -- In Babel?
|
|
356
362
|
case 'ClassProperty':
|
|
357
363
|
case 'Property':
|
|
358
364
|
/* eslint-enable no-fallthrough */
|
|
359
365
|
return node.computed && hasNonEmptyResolverCall(node.key, resolverName) || hasNonEmptyResolverCall(node.value, resolverName);
|
|
366
|
+
// @ts-expect-error Babel?
|
|
360
367
|
// istanbul ignore next -- In Babel?
|
|
361
368
|
case 'ObjectMethod':
|
|
369
|
+
// @ts-expect-error
|
|
362
370
|
// istanbul ignore next -- In Babel?
|
|
363
|
-
return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
|
|
371
|
+
return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
|
|
372
|
+
// @ts-expect-error
|
|
373
|
+
node.arguments.some(nde => {
|
|
364
374
|
return hasNonEmptyResolverCall(nde, resolverName);
|
|
365
375
|
});
|
|
366
376
|
case 'ClassExpression':
|
|
@@ -384,12 +394,14 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
|
|
|
384
394
|
case 'TaggedTemplateExpression':
|
|
385
395
|
return hasNonEmptyResolverCall(node.quasi, resolverName);
|
|
386
396
|
|
|
397
|
+
// @ts-expect-error Babel?
|
|
387
398
|
// ?.
|
|
388
399
|
// istanbul ignore next -- In Babel?
|
|
389
400
|
case 'OptionalMemberExpression':
|
|
390
401
|
case 'MemberExpression':
|
|
391
402
|
return hasNonEmptyResolverCall(node.object, resolverName) || hasNonEmptyResolverCall(node.property, resolverName);
|
|
392
403
|
|
|
404
|
+
// @ts-expect-error Babel?
|
|
393
405
|
// istanbul ignore next -- In Babel?
|
|
394
406
|
case 'Import':
|
|
395
407
|
case 'ImportExpression':
|
|
@@ -417,20 +429,25 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
|
|
|
417
429
|
/**
|
|
418
430
|
* Checks if a Promise executor has no resolve value or an empty value.
|
|
419
431
|
* An `undefined` resolve does not count.
|
|
420
|
-
*
|
|
421
|
-
* @param {object} node
|
|
432
|
+
* @param {ESTreeOrTypeScriptNode} node
|
|
422
433
|
* @param {boolean} anyPromiseAsReturn
|
|
423
|
-
* @param {boolean} allBranches
|
|
434
|
+
* @param {boolean} [allBranches]
|
|
424
435
|
* @returns {boolean}
|
|
425
436
|
*/
|
|
426
437
|
const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, allBranches) => {
|
|
427
|
-
const hasReturnMethod = allBranches ?
|
|
438
|
+
const hasReturnMethod = allBranches ?
|
|
439
|
+
/**
|
|
440
|
+
* @param {ESTreeOrTypeScriptNode} nde
|
|
441
|
+
* @param {PromiseFilter} promiseFilter
|
|
442
|
+
* @returns {boolean}
|
|
443
|
+
*/
|
|
444
|
+
(nde, promiseFilter) => {
|
|
428
445
|
let hasReturn;
|
|
429
446
|
try {
|
|
430
447
|
hasReturn = hasReturnValue(nde, true, promiseFilter);
|
|
431
448
|
} catch (error) {
|
|
432
449
|
// istanbul ignore else
|
|
433
|
-
if (error.message === 'Null return') {
|
|
450
|
+
if ( /** @type {Error} */error.message === 'Null return') {
|
|
434
451
|
return false;
|
|
435
452
|
}
|
|
436
453
|
|
|
@@ -440,9 +457,15 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
|
|
|
440
457
|
|
|
441
458
|
// `hasReturn` check needed since `throw` treated as valid return by
|
|
442
459
|
// `allBrancheshaveReturnValues`
|
|
443
|
-
return hasReturn && allBrancheshaveReturnValues(nde, promiseFilter);
|
|
444
|
-
} :
|
|
445
|
-
|
|
460
|
+
return Boolean(hasReturn && allBrancheshaveReturnValues(nde, promiseFilter));
|
|
461
|
+
} :
|
|
462
|
+
/**
|
|
463
|
+
* @param {ESTreeOrTypeScriptNode} nde
|
|
464
|
+
* @param {PromiseFilter} promiseFilter
|
|
465
|
+
* @returns {boolean}
|
|
466
|
+
*/
|
|
467
|
+
(nde, promiseFilter) => {
|
|
468
|
+
return Boolean(hasReturnValue(nde, false, promiseFilter));
|
|
446
469
|
};
|
|
447
470
|
return hasReturnMethod(node, prom => {
|
|
448
471
|
if (anyPromiseAsReturn) {
|
|
@@ -451,16 +474,22 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
|
|
|
451
474
|
if (isVoidPromise(prom)) {
|
|
452
475
|
return false;
|
|
453
476
|
}
|
|
454
|
-
const
|
|
477
|
+
const {
|
|
455
478
|
params,
|
|
456
479
|
body
|
|
457
|
-
} =
|
|
480
|
+
} =
|
|
481
|
+
/**
|
|
482
|
+
* @type {import('@typescript-eslint/types').TSESTree.FunctionExpression|
|
|
483
|
+
* import('@typescript-eslint/types').TSESTree.ArrowFunctionExpression}
|
|
484
|
+
*/
|
|
485
|
+
/** @type {import('@typescript-eslint/types').TSESTree.NewExpression} */prom.arguments[0] || {};
|
|
458
486
|
if (!(params !== null && params !== void 0 && params.length)) {
|
|
459
487
|
return false;
|
|
460
488
|
}
|
|
461
|
-
const
|
|
489
|
+
const {
|
|
462
490
|
name: resolverName
|
|
463
|
-
}
|
|
491
|
+
} = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */
|
|
492
|
+
params[0];
|
|
464
493
|
return hasNonEmptyResolverCall(body, resolverName);
|
|
465
494
|
});
|
|
466
495
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasReturnValue.js","names":["isNewPromiseExpression","node","type","callee","name","isVoidPromise","_node$typeParameters","_node$typeParameters$","_node$typeParameters$2","typeParameters","params","undefinedKeywords","Set","hasReturnValue","throwOnNullReturn","promFilter","_node$returnType","_node$returnType$type","returnType","typeAnnotation","has","value","expression","body","some","bodyNode","consequent","alternate","block","handler","finalizer","cases","someCase","nde","argument","Error","exports","allBrancheshaveReturnValues","_node$returnType2","_node$returnType2$typ","lastBodyNode","slice","test","error","message","every","consNode","hasNonEmptyResolverCall","resolverName","arguments","length","undefined","_node$params$","elements","element","right","left","expressions","subExpression","properties","property","decorators","decorator","computed","key","declarations","id","init","quasi","object","source","hasValueOrExecutorHasNonEmptyResolveValue","anyPromiseAsReturn","allBranches","hasReturnMethod","promiseFilter","hasReturn","prom"],"sources":["../../src/utils/hasReturnValue.js"],"sourcesContent":["/* eslint-disable jsdoc/no-undefined-types */\n\n/**\n * @typedef {import('estree').Node|\n * import('@typescript-eslint/types').TSESTree.TSTypeReference} ESTreeOrTypeScriptNode\n */\n\n/**\n * Checks if a node is a promise but has no resolve value or an empty value.\n * An `undefined` resolve does not count.\n *\n * @param {ESTreeOrTypeScriptNode} node\n * @returns {boolean}\n */\nconst isNewPromiseExpression = (node) => {\n return node && node.type === 'NewExpression' && node.callee.type === 'Identifier' &&\n node.callee.name === 'Promise';\n};\n\n/**\n * @param {import('@typescript-eslint/types').TSESTree.TSTypeReference} node\n * @returns {boolean}\n */\nconst isVoidPromise = (node) => {\n return node?.typeParameters?.params?.[0]?.type === 'TSVoidKeyword';\n};\n\nconst undefinedKeywords = new Set([\n 'TSVoidKeyword', 'TSUndefinedKeyword', 'TSNeverKeyword',\n]);\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n *\n * @param {import('estree').Node|import('@typescript-eslint/types').TSESTree.Node} node\n * @param {boolean} throwOnNullReturn\n * @param {PromiseFilter} promFilter\n * @returns {boolean|undefined}\n */\n// eslint-disable-next-line complexity\nconst hasReturnValue = (node, throwOnNullReturn, promFilter) => {\n if (!node) {\n return false;\n }\n\n switch (node.type) {\n case 'TSDeclareFunction':\n case 'TSFunctionType':\n case 'TSMethodSignature': {\n const type = node?.returnType?.typeAnnotation?.type;\n return type && !undefinedKeywords.has(type);\n }\n\n case 'MethodDefinition':\n return hasReturnValue(node.value, throwOnNullReturn, promFilter);\n case 'FunctionExpression':\n case 'FunctionDeclaration':\n case 'ArrowFunctionExpression': {\n return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) ||\n hasReturnValue(node.body, throwOnNullReturn, promFilter);\n }\n\n case 'BlockStatement': {\n return node.body.some((bodyNode) => {\n return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode, throwOnNullReturn, promFilter);\n });\n }\n\n case 'LabeledStatement':\n case 'WhileStatement':\n case 'DoWhileStatement':\n case 'ForStatement':\n case 'ForInStatement':\n case 'ForOfStatement':\n case 'WithStatement': {\n return hasReturnValue(node.body, throwOnNullReturn, promFilter);\n }\n\n case 'IfStatement': {\n return hasReturnValue(node.consequent, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.alternate, throwOnNullReturn, promFilter);\n }\n\n case 'TryStatement': {\n return hasReturnValue(node.block, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.handler && node.handler.body, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.finalizer, throwOnNullReturn, promFilter);\n }\n\n case 'SwitchStatement': {\n return node.cases.some(\n (someCase) => {\n return someCase.consequent.some((nde) => {\n return hasReturnValue(nde, throwOnNullReturn, promFilter);\n });\n },\n );\n }\n\n case 'ReturnStatement': {\n // void return does not count.\n if (node.argument === null) {\n if (throwOnNullReturn) {\n throw new Error('Null return');\n }\n\n return false;\n }\n\n if (promFilter && isNewPromiseExpression(node.argument)) {\n // Let caller decide how to filter, but this is, at the least,\n // a return of sorts and truthy\n return promFilter(node.argument);\n }\n\n return true;\n }\n\n default: {\n return false;\n }\n }\n};\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n *\n * @param {object} node\n * @param {PromiseFilter} promFilter\n * @returns {boolean|import('estree').Node}\n */\n// eslint-disable-next-line complexity\nconst allBrancheshaveReturnValues = (node, promFilter) => {\n if (!node) {\n return false;\n }\n\n switch (node.type) {\n case 'TSDeclareFunction':\n case 'TSFunctionType':\n case 'TSMethodSignature': {\n const type = node?.returnType?.typeAnnotation?.type;\n return type && !undefinedKeywords.has(type);\n }\n\n // case 'MethodDefinition':\n // return allBrancheshaveReturnValues(node.value, promFilter);\n case 'FunctionExpression':\n case 'FunctionDeclaration':\n case 'ArrowFunctionExpression': {\n return node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) ||\n allBrancheshaveReturnValues(node.body, promFilter) || node.body.body.some((nde) => {\n return nde.type === 'ReturnStatement';\n });\n }\n\n case 'BlockStatement': {\n const lastBodyNode = node.body.slice(-1)[0];\n return allBrancheshaveReturnValues(lastBodyNode, promFilter);\n }\n\n case 'WhileStatement':\n case 'DoWhileStatement':\n if (node.test.value === true) {\n // If this is an infinite loop, we assume only one branch\n // is needed to provide a return\n return hasReturnValue(node.body, false, promFilter);\n }\n\n // Fallthrough\n case 'LabeledStatement':\n case 'ForStatement':\n case 'ForInStatement':\n case 'ForOfStatement':\n case 'WithStatement': {\n return allBrancheshaveReturnValues(node.body, promFilter);\n }\n\n case 'IfStatement': {\n return allBrancheshaveReturnValues(node.consequent, promFilter) && allBrancheshaveReturnValues(node.alternate, promFilter);\n }\n\n case 'TryStatement': {\n // If `finally` returns, all return\n return node.finalizer && allBrancheshaveReturnValues(node.finalizer, promFilter) ||\n // Return in `try`/`catch` may still occur despite `finally`\n allBrancheshaveReturnValues(node.block, promFilter) &&\n (!node.handler ||\n allBrancheshaveReturnValues(node.handler && node.handler.body, promFilter)) &&\n (!node.finalizer || (() => {\n try {\n hasReturnValue(node.finalizer, true, promFilter);\n } catch (error) {\n // istanbul ignore else\n if (error.message === 'Null return') {\n return false;\n }\n\n // istanbul ignore next\n throw error;\n }\n\n // As long as not an explicit empty return, then return true\n return true;\n })());\n }\n\n case 'SwitchStatement': {\n return node.cases.every(\n (someCase) => {\n return !someCase.consequent.some((consNode) => {\n return consNode.type === 'BreakStatement' ||\n consNode.type === 'ReturnStatement' && consNode.argument === null;\n });\n },\n );\n }\n\n case 'ThrowStatement': {\n return true;\n }\n\n case 'ReturnStatement': {\n // void return does not count.\n if (node.argument === null) {\n return false;\n }\n\n if (promFilter && isNewPromiseExpression(node.argument)) {\n // Let caller decide how to filter, but this is, at the least,\n // a return of sorts and truthy\n return promFilter(node.argument);\n }\n\n return true;\n }\n\n default: {\n return false;\n }\n }\n};\n\n/**\n * @callback PromiseFilter\n * @param {object} node\n * @returns {boolean}\n */\n\n/**\n * Avoids further checking child nodes if a nested function shadows the\n * resolver, but otherwise, if name is used (by call or passed in as an\n * argument to another function), will be considered as non-empty.\n *\n * This could check for redeclaration of the resolver, but as such is\n * unlikely, we avoid the performance cost of checking everywhere for\n * (re)declarations or assignments.\n *\n * @param {AST} node\n * @param {string} resolverName\n * @returns {boolean}\n */\n// eslint-disable-next-line complexity\nconst hasNonEmptyResolverCall = (node, resolverName) => {\n if (!node) {\n return false;\n }\n\n // Arrow function without block\n switch (node.type) {\n // istanbul ignore next -- In Babel?\n case 'OptionalCallExpression':\n case 'CallExpression':\n return node.callee.name === resolverName && (\n\n // Implicit or explicit undefined\n node.arguments.length > 1 || node.arguments[0] !== undefined\n ) ||\n node.arguments.some((nde) => {\n // Being passed in to another function (which might invoke it)\n return nde.type === 'Identifier' && nde.name === resolverName ||\n\n // Handle nested items\n hasNonEmptyResolverCall(nde, resolverName);\n });\n case 'ChainExpression':\n case 'Decorator':\n case 'ExpressionStatement':\n return hasNonEmptyResolverCall(node.expression, resolverName);\n case 'ClassBody':\n case 'BlockStatement':\n return node.body.some((bodyNode) => {\n return hasNonEmptyResolverCall(bodyNode, resolverName);\n });\n case 'FunctionExpression':\n case 'FunctionDeclaration':\n case 'ArrowFunctionExpression': {\n // Shadowing\n if (node.params[0]?.name === resolverName) {\n return false;\n }\n\n return hasNonEmptyResolverCall(node.body, resolverName);\n }\n\n case 'LabeledStatement':\n case 'WhileStatement':\n case 'DoWhileStatement':\n case 'ForStatement':\n case 'ForInStatement':\n case 'ForOfStatement':\n case 'WithStatement': {\n return hasNonEmptyResolverCall(node.body, resolverName);\n }\n\n case 'ConditionalExpression':\n case 'IfStatement': {\n return hasNonEmptyResolverCall(node.test, resolverName) ||\n hasNonEmptyResolverCall(node.consequent, resolverName) ||\n hasNonEmptyResolverCall(node.alternate, resolverName);\n }\n\n case 'TryStatement': {\n return hasNonEmptyResolverCall(node.block, resolverName) ||\n hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) ||\n hasNonEmptyResolverCall(node.finalizer, resolverName);\n }\n\n case 'SwitchStatement': {\n return node.cases.some(\n (someCase) => {\n return someCase.consequent.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n },\n );\n }\n\n case 'ArrayPattern':\n case 'ArrayExpression':\n return node.elements.some((element) => {\n return hasNonEmptyResolverCall(element, resolverName);\n });\n\n case 'AssignmentPattern':\n return hasNonEmptyResolverCall(node.right, resolverName);\n\n case 'AssignmentExpression':\n case 'BinaryExpression':\n case 'LogicalExpression': {\n return hasNonEmptyResolverCall(node.left, resolverName) ||\n hasNonEmptyResolverCall(node.right, resolverName);\n }\n\n // Comma\n case 'SequenceExpression':\n case 'TemplateLiteral':\n return node.expressions.some((subExpression) => {\n return hasNonEmptyResolverCall(subExpression, resolverName);\n });\n\n case 'ObjectPattern':\n case 'ObjectExpression':\n return node.properties.some((property) => {\n return hasNonEmptyResolverCall(property, resolverName);\n });\n // istanbul ignore next -- In Babel?\n case 'ClassMethod':\n case 'MethodDefinition':\n return node.decorators && node.decorators.some((decorator) => {\n return hasNonEmptyResolverCall(decorator, resolverName);\n }) ||\n node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n hasNonEmptyResolverCall(node.value, resolverName);\n\n // istanbul ignore next -- In Babel?\n case 'ObjectProperty':\n /* eslint-disable no-fallthrough */\n // istanbul ignore next -- In Babel?\n case 'PropertyDefinition':\n // istanbul ignore next -- In Babel?\n case 'ClassProperty':\n case 'Property':\n /* eslint-enable no-fallthrough */\n return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n hasNonEmptyResolverCall(node.value, resolverName);\n // istanbul ignore next -- In Babel?\n case 'ObjectMethod':\n // istanbul ignore next -- In Babel?\n return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n node.arguments.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n\n case 'ClassExpression':\n case 'ClassDeclaration':\n return hasNonEmptyResolverCall(node.body, resolverName);\n\n case 'AwaitExpression':\n case 'SpreadElement':\n case 'UnaryExpression':\n case 'YieldExpression':\n return hasNonEmptyResolverCall(node.argument, resolverName);\n\n case 'VariableDeclaration': {\n return node.declarations.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n }\n\n case 'VariableDeclarator': {\n return hasNonEmptyResolverCall(node.id, resolverName) ||\n hasNonEmptyResolverCall(node.init, resolverName);\n }\n\n case 'TaggedTemplateExpression':\n return hasNonEmptyResolverCall(node.quasi, resolverName);\n\n // ?.\n // istanbul ignore next -- In Babel?\n case 'OptionalMemberExpression':\n case 'MemberExpression':\n return hasNonEmptyResolverCall(node.object, resolverName) ||\n hasNonEmptyResolverCall(node.property, resolverName);\n\n // istanbul ignore next -- In Babel?\n case 'Import':\n case 'ImportExpression':\n return hasNonEmptyResolverCall(node.source, resolverName);\n\n case 'ReturnStatement': {\n if (node.argument === null) {\n return false;\n }\n\n return hasNonEmptyResolverCall(node.argument, resolverName);\n }\n\n /*\n // Shouldn't need to parse literals/literal components, etc.\n\n case 'Identifier':\n case 'TemplateElement':\n case 'Super':\n // Exports not relevant in this context\n */\n default:\n return false;\n }\n};\n\n/**\n * Checks if a Promise executor has no resolve value or an empty value.\n * An `undefined` resolve does not count.\n *\n * @param {object} node\n * @param {boolean} anyPromiseAsReturn\n * @param {boolean} allBranches\n * @returns {boolean}\n */\nconst hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, allBranches) => {\n const hasReturnMethod = allBranches ?\n (nde, promiseFilter) => {\n let hasReturn;\n try {\n hasReturn = hasReturnValue(nde, true, promiseFilter);\n } catch (error) {\n // istanbul ignore else\n if (error.message === 'Null return') {\n return false;\n }\n\n // istanbul ignore next\n throw error;\n }\n\n // `hasReturn` check needed since `throw` treated as valid return by\n // `allBrancheshaveReturnValues`\n return hasReturn && allBrancheshaveReturnValues(nde, promiseFilter);\n } :\n (nde, promiseFilter) => {\n return hasReturnValue(nde, false, promiseFilter);\n };\n\n return hasReturnMethod(node, (prom) => {\n if (anyPromiseAsReturn) {\n return true;\n }\n\n if (isVoidPromise(prom)) {\n return false;\n }\n\n const [\n {\n params,\n body,\n } = {},\n ] = prom.arguments;\n\n if (!params?.length) {\n return false;\n }\n\n const [\n {\n name: resolverName,\n },\n ] = params;\n\n return hasNonEmptyResolverCall(body, resolverName);\n });\n};\n\nexport {\n hasReturnValue,\n hasValueOrExecutorHasNonEmptyResolveValue,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hasReturnValue.js","names":["isNewPromiseExpression","node","type","callee","name","isVoidPromise","_node$typeParameters","_node$typeParameters$","_node$typeParameters$2","typeParameters","params","undefinedKeywords","Set","hasReturnValue","throwOnNullReturn","promFilter","_node$returnType","_node$returnType$type","returnType","typeAnnotation","has","value","expression","body","some","bodyNode","consequent","alternate","block","handler","finalizer","cases","someCase","nde","argument","Error","exports","allBrancheshaveReturnValues","_node$returnType2","_node$returnType2$typ","lastBodyNode","slice","test","error","message","every","consNode","hasNonEmptyResolverCall","resolverName","arguments","length","undefined","_node$params$","elements","element","right","left","expressions","subExpression","properties","property","decorators","decorator","computed","key","declarations","id","init","quasi","object","source","hasValueOrExecutorHasNonEmptyResolveValue","anyPromiseAsReturn","allBranches","hasReturnMethod","promiseFilter","hasReturn","Boolean","prom"],"sources":["../../src/utils/hasReturnValue.js"],"sourcesContent":["/**\n * @typedef {import('estree').Node|\n * import('@typescript-eslint/types').TSESTree.Node} ESTreeOrTypeScriptNode\n */\n\n/**\n * Checks if a node is a promise but has no resolve value or an empty value.\n * An `undefined` resolve does not count.\n * @param {ESTreeOrTypeScriptNode|undefined|null} node\n * @returns {boolean|undefined|null}\n */\nconst isNewPromiseExpression = (node) => {\n return node && node.type === 'NewExpression' && node.callee.type === 'Identifier' &&\n node.callee.name === 'Promise';\n};\n\n/**\n * @param {ESTreeOrTypeScriptNode|null|undefined} node\n * @returns {boolean}\n */\nconst isVoidPromise = (node) => {\n return /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (\n node\n )?.typeParameters?.params?.[0]?.type === 'TSVoidKeyword';\n};\n\nconst undefinedKeywords = new Set([\n 'TSVoidKeyword', 'TSUndefinedKeyword', 'TSNeverKeyword',\n]);\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n * @param {ESTreeOrTypeScriptNode|undefined|null} node\n * @param {boolean} [throwOnNullReturn]\n * @param {PromiseFilter} [promFilter]\n * @returns {boolean|undefined}\n */\n// eslint-disable-next-line complexity\nconst hasReturnValue = (node, throwOnNullReturn, promFilter) => {\n if (!node) {\n return false;\n }\n\n switch (node.type) {\n case 'TSDeclareFunction':\n case 'TSFunctionType':\n case 'TSMethodSignature': {\n const type = node?.returnType?.typeAnnotation?.type;\n return type && !undefinedKeywords.has(type);\n }\n\n case 'MethodDefinition':\n return hasReturnValue(node.value, throwOnNullReturn, promFilter);\n case 'FunctionExpression':\n case 'FunctionDeclaration':\n case 'ArrowFunctionExpression': {\n return 'expression' in node && node.expression && (!isNewPromiseExpression(\n node.body,\n ) || !isVoidPromise(node.body)) ||\n hasReturnValue(node.body, throwOnNullReturn, promFilter);\n }\n\n case 'BlockStatement': {\n return node.body.some((bodyNode) => {\n return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode, throwOnNullReturn, promFilter);\n });\n }\n\n case 'LabeledStatement':\n case 'WhileStatement':\n case 'DoWhileStatement':\n case 'ForStatement':\n case 'ForInStatement':\n case 'ForOfStatement':\n case 'WithStatement': {\n return hasReturnValue(node.body, throwOnNullReturn, promFilter);\n }\n\n case 'IfStatement': {\n return hasReturnValue(node.consequent, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.alternate, throwOnNullReturn, promFilter);\n }\n\n case 'TryStatement': {\n return hasReturnValue(node.block, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.handler && node.handler.body, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.finalizer, throwOnNullReturn, promFilter);\n }\n\n case 'SwitchStatement': {\n return node.cases.some(\n (someCase) => {\n return someCase.consequent.some((nde) => {\n return hasReturnValue(nde, throwOnNullReturn, promFilter);\n });\n },\n );\n }\n\n case 'ReturnStatement': {\n // void return does not count.\n if (node.argument === null) {\n if (throwOnNullReturn) {\n throw new Error('Null return');\n }\n\n return false;\n }\n\n if (promFilter && isNewPromiseExpression(node.argument)) {\n // Let caller decide how to filter, but this is, at the least,\n // a return of sorts and truthy\n return promFilter(node.argument);\n }\n\n return true;\n }\n\n default: {\n return false;\n }\n }\n};\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n * @param {ESTreeOrTypeScriptNode|null|undefined} node\n * @param {PromiseFilter} promFilter\n * @returns {undefined|boolean|ESTreeOrTypeScriptNode}\n */\n// eslint-disable-next-line complexity\nconst allBrancheshaveReturnValues = (node, promFilter) => {\n if (!node) {\n return false;\n }\n\n switch (node.type) {\n case 'TSDeclareFunction':\n case 'TSFunctionType':\n case 'TSMethodSignature': {\n const type = node?.returnType?.typeAnnotation?.type;\n return type && !undefinedKeywords.has(type);\n }\n\n // case 'MethodDefinition':\n // return allBrancheshaveReturnValues(node.value, promFilter);\n case 'FunctionExpression':\n case 'FunctionDeclaration':\n case 'ArrowFunctionExpression': {\n return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) ||\n allBrancheshaveReturnValues(node.body, promFilter) ||\n /** @type {import('@typescript-eslint/types').TSESTree.BlockStatement} */\n (node.body).body.some((nde) => {\n return nde.type === 'ReturnStatement';\n });\n }\n\n case 'BlockStatement': {\n const lastBodyNode = node.body.slice(-1)[0];\n return allBrancheshaveReturnValues(lastBodyNode, promFilter);\n }\n\n case 'WhileStatement':\n case 'DoWhileStatement':\n if (\n /**\n * @type {import('@typescript-eslint/types').TSESTree.Literal}\n */\n (node.test).value === true\n ) {\n // If this is an infinite loop, we assume only one branch\n // is needed to provide a return\n return hasReturnValue(node.body, false, promFilter);\n }\n\n // Fallthrough\n case 'LabeledStatement':\n case 'ForStatement':\n case 'ForInStatement':\n case 'ForOfStatement':\n case 'WithStatement': {\n return allBrancheshaveReturnValues(node.body, promFilter);\n }\n\n case 'IfStatement': {\n return allBrancheshaveReturnValues(node.consequent, promFilter) &&\n allBrancheshaveReturnValues(node.alternate, promFilter);\n }\n\n case 'TryStatement': {\n // If `finally` returns, all return\n return node.finalizer && allBrancheshaveReturnValues(node.finalizer, promFilter) ||\n // Return in `try`/`catch` may still occur despite `finally`\n allBrancheshaveReturnValues(node.block, promFilter) &&\n (!node.handler ||\n allBrancheshaveReturnValues(node.handler && node.handler.body, promFilter)) &&\n (!node.finalizer || (() => {\n try {\n hasReturnValue(node.finalizer, true, promFilter);\n } catch (error) {\n // istanbul ignore else\n if (/** @type {Error} */ (error).message === 'Null return') {\n return false;\n }\n\n // istanbul ignore next\n throw error;\n }\n\n // As long as not an explicit empty return, then return true\n return true;\n })());\n }\n\n case 'SwitchStatement': {\n return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */ (node).cases.every(\n (someCase) => {\n return !someCase.consequent.some((consNode) => {\n return consNode.type === 'BreakStatement' ||\n consNode.type === 'ReturnStatement' && consNode.argument === null;\n });\n },\n );\n }\n\n case 'ThrowStatement': {\n return true;\n }\n\n case 'ReturnStatement': {\n // void return does not count.\n if (node.argument === null) {\n return false;\n }\n\n if (promFilter && isNewPromiseExpression(node.argument)) {\n // Let caller decide how to filter, but this is, at the least,\n // a return of sorts and truthy\n return promFilter(node.argument);\n }\n\n return true;\n }\n\n default: {\n return false;\n }\n }\n};\n\n/**\n * @callback PromiseFilter\n * @param {ESTreeOrTypeScriptNode|undefined} node\n * @returns {boolean}\n */\n\n/**\n * Avoids further checking child nodes if a nested function shadows the\n * resolver, but otherwise, if name is used (by call or passed in as an\n * argument to another function), will be considered as non-empty.\n *\n * This could check for redeclaration of the resolver, but as such is\n * unlikely, we avoid the performance cost of checking everywhere for\n * (re)declarations or assignments.\n * @param {import('@typescript-eslint/types').TSESTree.Node|null|undefined} node\n * @param {string} resolverName\n * @returns {boolean}\n */\n// eslint-disable-next-line complexity\nconst hasNonEmptyResolverCall = (node, resolverName) => {\n if (!node) {\n return false;\n }\n\n // Arrow function without block\n switch (node.type) {\n // @ts-expect-error Babel?\n // istanbul ignore next -- In Babel?\n case 'OptionalCallExpression':\n case 'CallExpression':\n return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n node.callee\n ).name === resolverName && (\n\n // Implicit or explicit undefined\n node.arguments.length > 1 || node.arguments[0] !== undefined\n ) ||\n node.arguments.some((nde) => {\n // Being passed in to another function (which might invoke it)\n return nde.type === 'Identifier' && nde.name === resolverName ||\n\n // Handle nested items\n hasNonEmptyResolverCall(nde, resolverName);\n });\n case 'ChainExpression':\n case 'Decorator':\n case 'ExpressionStatement':\n return hasNonEmptyResolverCall(node.expression, resolverName);\n case 'ClassBody':\n case 'BlockStatement':\n return node.body.some((bodyNode) => {\n return hasNonEmptyResolverCall(bodyNode, resolverName);\n });\n case 'FunctionExpression':\n case 'FunctionDeclaration':\n case 'ArrowFunctionExpression': {\n // Shadowing\n if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n node.params[0]\n )?.name === resolverName) {\n return false;\n }\n\n return hasNonEmptyResolverCall(node.body, resolverName);\n }\n\n case 'LabeledStatement':\n case 'WhileStatement':\n case 'DoWhileStatement':\n case 'ForStatement':\n case 'ForInStatement':\n case 'ForOfStatement':\n case 'WithStatement': {\n return hasNonEmptyResolverCall(node.body, resolverName);\n }\n\n case 'ConditionalExpression':\n case 'IfStatement': {\n return hasNonEmptyResolverCall(node.test, resolverName) ||\n hasNonEmptyResolverCall(node.consequent, resolverName) ||\n hasNonEmptyResolverCall(node.alternate, resolverName);\n }\n\n case 'TryStatement': {\n return hasNonEmptyResolverCall(node.block, resolverName) ||\n hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) ||\n hasNonEmptyResolverCall(node.finalizer, resolverName);\n }\n\n case 'SwitchStatement': {\n return node.cases.some(\n (someCase) => {\n return someCase.consequent.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n },\n );\n }\n\n case 'ArrayPattern':\n case 'ArrayExpression':\n return node.elements.some((element) => {\n return hasNonEmptyResolverCall(element, resolverName);\n });\n\n case 'AssignmentPattern':\n return hasNonEmptyResolverCall(node.right, resolverName);\n\n case 'AssignmentExpression':\n case 'BinaryExpression':\n case 'LogicalExpression': {\n return hasNonEmptyResolverCall(node.left, resolverName) ||\n hasNonEmptyResolverCall(node.right, resolverName);\n }\n\n // Comma\n case 'SequenceExpression':\n case 'TemplateLiteral':\n return node.expressions.some((subExpression) => {\n return hasNonEmptyResolverCall(subExpression, resolverName);\n });\n\n case 'ObjectPattern':\n case 'ObjectExpression':\n return node.properties.some((property) => {\n return hasNonEmptyResolverCall(property, resolverName);\n });\n // @ts-expect-error Babel?\n // istanbul ignore next -- In Babel?\n case 'ClassMethod':\n case 'MethodDefinition':\n return node.decorators && node.decorators.some((decorator) => {\n return hasNonEmptyResolverCall(decorator, resolverName);\n }) ||\n node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n hasNonEmptyResolverCall(node.value, resolverName);\n\n // @ts-expect-error Babel?\n // istanbul ignore next -- In Babel?\n case 'ObjectProperty':\n /* eslint-disable no-fallthrough */\n // istanbul ignore next -- In Babel?\n case 'PropertyDefinition':\n // @ts-expect-error Babel?\n // istanbul ignore next -- In Babel?\n case 'ClassProperty':\n case 'Property':\n /* eslint-enable no-fallthrough */\n return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n hasNonEmptyResolverCall(node.value, resolverName);\n // @ts-expect-error Babel?\n // istanbul ignore next -- In Babel?\n case 'ObjectMethod':\n // @ts-expect-error\n // istanbul ignore next -- In Babel?\n return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n // @ts-expect-error\n node.arguments.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n\n case 'ClassExpression':\n case 'ClassDeclaration':\n return hasNonEmptyResolverCall(node.body, resolverName);\n\n case 'AwaitExpression':\n case 'SpreadElement':\n case 'UnaryExpression':\n case 'YieldExpression':\n return hasNonEmptyResolverCall(node.argument, resolverName);\n\n case 'VariableDeclaration': {\n return node.declarations.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n }\n\n case 'VariableDeclarator': {\n return hasNonEmptyResolverCall(node.id, resolverName) ||\n hasNonEmptyResolverCall(node.init, resolverName);\n }\n\n case 'TaggedTemplateExpression':\n return hasNonEmptyResolverCall(node.quasi, resolverName);\n\n // @ts-expect-error Babel?\n // ?.\n // istanbul ignore next -- In Babel?\n case 'OptionalMemberExpression':\n case 'MemberExpression':\n return hasNonEmptyResolverCall(node.object, resolverName) ||\n hasNonEmptyResolverCall(node.property, resolverName);\n\n // @ts-expect-error Babel?\n // istanbul ignore next -- In Babel?\n case 'Import':\n case 'ImportExpression':\n return hasNonEmptyResolverCall(node.source, resolverName);\n\n case 'ReturnStatement': {\n if (node.argument === null) {\n return false;\n }\n\n return hasNonEmptyResolverCall(node.argument, resolverName);\n }\n\n /*\n // Shouldn't need to parse literals/literal components, etc.\n\n case 'Identifier':\n case 'TemplateElement':\n case 'Super':\n // Exports not relevant in this context\n */\n default:\n return false;\n }\n};\n\n/**\n * Checks if a Promise executor has no resolve value or an empty value.\n * An `undefined` resolve does not count.\n * @param {ESTreeOrTypeScriptNode} node\n * @param {boolean} anyPromiseAsReturn\n * @param {boolean} [allBranches]\n * @returns {boolean}\n */\nconst hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, allBranches) => {\n const hasReturnMethod = allBranches ?\n /**\n * @param {ESTreeOrTypeScriptNode} nde\n * @param {PromiseFilter} promiseFilter\n * @returns {boolean}\n */\n (nde, promiseFilter) => {\n let hasReturn;\n try {\n hasReturn = hasReturnValue(nde, true, promiseFilter);\n } catch (error) {\n // istanbul ignore else\n if (/** @type {Error} */ (error).message === 'Null return') {\n return false;\n }\n\n // istanbul ignore next\n throw error;\n }\n\n // `hasReturn` check needed since `throw` treated as valid return by\n // `allBrancheshaveReturnValues`\n return Boolean(hasReturn && allBrancheshaveReturnValues(nde, promiseFilter));\n } :\n /**\n * @param {ESTreeOrTypeScriptNode} nde\n * @param {PromiseFilter} promiseFilter\n * @returns {boolean}\n */\n (nde, promiseFilter) => {\n return Boolean(hasReturnValue(nde, false, promiseFilter));\n };\n\n return hasReturnMethod(node, (prom) => {\n if (anyPromiseAsReturn) {\n return true;\n }\n\n if (isVoidPromise(prom)) {\n return false;\n }\n\n const {\n params,\n body,\n } =\n /**\n * @type {import('@typescript-eslint/types').TSESTree.FunctionExpression|\n * import('@typescript-eslint/types').TSESTree.ArrowFunctionExpression}\n */ (\n /** @type {import('@typescript-eslint/types').TSESTree.NewExpression} */ (\n prom\n ).arguments[0]\n ) || {};\n\n if (!params?.length) {\n return false;\n }\n\n const {\n name: resolverName,\n } = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n params[0]\n );\n\n return hasNonEmptyResolverCall(body, resolverName);\n });\n};\n\nexport {\n hasReturnValue,\n hasValueOrExecutorHasNonEmptyResolveValue,\n};\n"],"mappings":"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"}
|
|
@@ -991,5 +991,12 @@ function quux () {
|
|
|
991
991
|
*/
|
|
992
992
|
function quux () {}
|
|
993
993
|
// "jsdoc/check-line-alignment": ["error"|"warn", "never",{"wrapIndent":" "}]
|
|
994
|
+
|
|
995
|
+
/**
|
|
996
|
+
* Returns cached value of negative scale of the world transform.
|
|
997
|
+
*
|
|
998
|
+
* @returns {number} -1 if world transform has negative scale, 1 otherwise.
|
|
999
|
+
*/
|
|
1000
|
+
// "jsdoc/check-line-alignment": ["error"|"warn", "never"]
|
|
994
1001
|
````
|
|
995
1002
|
|
|
@@ -764,6 +764,15 @@ function Test() {
|
|
|
764
764
|
*/
|
|
765
765
|
// "jsdoc/check-tag-names": ["error"|"warn", {"typed":true}]
|
|
766
766
|
// Message: '@typedef' is redundant when using a type system.
|
|
767
|
+
|
|
768
|
+
/**
|
|
769
|
+
* @todo
|
|
770
|
+
*/
|
|
771
|
+
function quux () {
|
|
772
|
+
|
|
773
|
+
}
|
|
774
|
+
// Settings: {"jsdoc":{"tagNamePreference":{"todo":{"message":"Please don't use todo"}}}}
|
|
775
|
+
// Message: Please don't use todo
|
|
767
776
|
````
|
|
768
777
|
|
|
769
778
|
|
|
@@ -1113,5 +1122,11 @@ interface WebTwain {
|
|
|
1113
1122
|
* @satisfies
|
|
1114
1123
|
*/
|
|
1115
1124
|
// Settings: {"jsdoc":{"mode":"typescript"}}
|
|
1125
|
+
|
|
1126
|
+
/**
|
|
1127
|
+
* @module
|
|
1128
|
+
* A comment related to the module
|
|
1129
|
+
*/
|
|
1130
|
+
// "jsdoc/check-tag-names": ["error"|"warn", {"typed":true}]
|
|
1116
1131
|
````
|
|
1117
1132
|
|
|
@@ -189,6 +189,12 @@ function quux () {
|
|
|
189
189
|
function quux () {}
|
|
190
190
|
// "jsdoc/no-missing-syntax": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock:has(JsdocTag[name=/opt_/])","context":"any","message":"Require names matching `/^opt_/i`."}]}]
|
|
191
191
|
// Message: Require names matching `/^opt_/i`.
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* @implements {Bar|Foo}
|
|
195
|
+
*/
|
|
196
|
+
// "jsdoc/no-missing-syntax": ["error"|"warn", {"contexts":[{"context":"FunctionDeclaration"}]}]
|
|
197
|
+
// Message: Syntax is required: FunctionDeclaration
|
|
192
198
|
````
|
|
193
199
|
|
|
194
200
|
|
|
@@ -301,6 +301,12 @@ const a = new Todo();
|
|
|
301
301
|
* a link that is {@link NotKnown}
|
|
302
302
|
*/
|
|
303
303
|
// Message: The type 'NotKnown' is undefined.
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* This is a {@namepathOrURLReferencer SomeType}.
|
|
307
|
+
*/
|
|
308
|
+
// Settings: {"jsdoc":{"structuredTags":{"namepathOrURLReferencer":{"name":"namepath-or-url-referencing"}}}}
|
|
309
|
+
// Message: The type 'SomeType' is undefined.
|
|
304
310
|
````
|
|
305
311
|
|
|
306
312
|
|