eslint-plugin-jsdoc 44.2.3 → 44.2.4

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.
Files changed (110) hide show
  1. package/dist/alignTransform.js +86 -4
  2. package/dist/alignTransform.js.map +1 -1
  3. package/dist/exportParser.js +134 -4
  4. package/dist/exportParser.js.map +1 -1
  5. package/dist/iterateJsdoc.js +936 -345
  6. package/dist/iterateJsdoc.js.map +1 -1
  7. package/dist/jsdocUtils.js +173 -105
  8. package/dist/jsdocUtils.js.map +1 -1
  9. package/dist/rules/checkAlignment.js +6 -0
  10. package/dist/rules/checkAlignment.js.map +1 -1
  11. package/dist/rules/checkExamples.js +70 -6
  12. package/dist/rules/checkExamples.js.map +1 -1
  13. package/dist/rules/checkIndentation.js +11 -1
  14. package/dist/rules/checkIndentation.js.map +1 -1
  15. package/dist/rules/checkLineAlignment.js +68 -4
  16. package/dist/rules/checkLineAlignment.js.map +1 -1
  17. package/dist/rules/checkParamNames.js +12 -7
  18. package/dist/rules/checkParamNames.js.map +1 -1
  19. package/dist/rules/checkPropertyNames.js +13 -7
  20. package/dist/rules/checkPropertyNames.js.map +1 -1
  21. package/dist/rules/checkTagNames.js +45 -5
  22. package/dist/rules/checkTagNames.js.map +1 -1
  23. package/dist/rules/checkTypes.js +97 -36
  24. package/dist/rules/checkTypes.js.map +1 -1
  25. package/dist/rules/checkValues.js +6 -6
  26. package/dist/rules/checkValues.js.map +1 -1
  27. package/dist/rules/emptyTags.js +8 -1
  28. package/dist/rules/emptyTags.js.map +1 -1
  29. package/dist/rules/informativeDocs.js +26 -7
  30. package/dist/rules/informativeDocs.js.map +1 -1
  31. package/dist/rules/matchDescription.js +18 -1
  32. package/dist/rules/matchDescription.js.map +1 -1
  33. package/dist/rules/matchName.js +2 -2
  34. package/dist/rules/matchName.js.map +1 -1
  35. package/dist/rules/multilineBlocks.js +12 -1
  36. package/dist/rules/multilineBlocks.js.map +1 -1
  37. package/dist/rules/noBadBlocks.js +3 -5
  38. package/dist/rules/noBadBlocks.js.map +1 -1
  39. package/dist/rules/noBlankBlockDescriptions.js +2 -0
  40. package/dist/rules/noBlankBlockDescriptions.js.map +1 -1
  41. package/dist/rules/noMissingSyntax.js +58 -15
  42. package/dist/rules/noMissingSyntax.js.map +1 -1
  43. package/dist/rules/noMultiAsterisks.js +1 -6
  44. package/dist/rules/noMultiAsterisks.js.map +1 -1
  45. package/dist/rules/noRestrictedSyntax.js +17 -4
  46. package/dist/rules/noRestrictedSyntax.js.map +1 -1
  47. package/dist/rules/noTypes.js +3 -0
  48. package/dist/rules/noTypes.js.map +1 -1
  49. package/dist/rules/noUndefinedTypes.js +61 -20
  50. package/dist/rules/noUndefinedTypes.js.map +1 -1
  51. package/dist/rules/requireAsteriskPrefix.js +20 -0
  52. package/dist/rules/requireAsteriskPrefix.js.map +1 -1
  53. package/dist/rules/requireDescription.js +6 -2
  54. package/dist/rules/requireDescription.js.map +1 -1
  55. package/dist/rules/requireDescriptionCompleteSentence.js +72 -9
  56. package/dist/rules/requireDescriptionCompleteSentence.js.map +1 -1
  57. package/dist/rules/requireFileOverview.js +9 -4
  58. package/dist/rules/requireFileOverview.js.map +1 -1
  59. package/dist/rules/requireHyphenBeforeParamDescription.js +23 -6
  60. package/dist/rules/requireHyphenBeforeParamDescription.js.map +1 -1
  61. package/dist/rules/requireJsdoc.js +144 -28
  62. package/dist/rules/requireJsdoc.js.map +1 -1
  63. package/dist/rules/requireParam.js +46 -2
  64. package/dist/rules/requireParam.js.map +1 -1
  65. package/dist/rules/requireProperty.js +1 -1
  66. package/dist/rules/requireProperty.js.map +1 -1
  67. package/dist/rules/requireReturns.js +2 -2
  68. package/dist/rules/requireReturns.js.map +1 -1
  69. package/dist/rules/requireReturnsCheck.js +9 -2
  70. package/dist/rules/requireReturnsCheck.js.map +1 -1
  71. package/dist/rules/requireThrows.js +2 -2
  72. package/dist/rules/requireThrows.js.map +1 -1
  73. package/dist/rules/requireYields.js +9 -2
  74. package/dist/rules/requireYields.js.map +1 -1
  75. package/dist/rules/requireYieldsCheck.js +19 -5
  76. package/dist/rules/requireYieldsCheck.js.map +1 -1
  77. package/dist/rules/sortTags.js +67 -9
  78. package/dist/rules/sortTags.js.map +1 -1
  79. package/dist/rules/tagLines.js +22 -3
  80. package/dist/rules/tagLines.js.map +1 -1
  81. package/dist/rules/textEscaping.js +16 -2
  82. package/dist/rules/textEscaping.js.map +1 -1
  83. package/dist/rules/validTypes.js +25 -8
  84. package/dist/rules/validTypes.js.map +1 -1
  85. package/dist/utils/hasReturnValue.js +77 -43
  86. package/dist/utils/hasReturnValue.js.map +1 -1
  87. package/docs/rules/check-tag-names.md +15 -0
  88. package/docs/rules/no-missing-syntax.md +6 -0
  89. package/docs/rules/require-description-complete-sentence.md +525 -289
  90. package/docs/rules/require-description.md +289 -525
  91. package/docs/rules/require-file-overview.md +7 -0
  92. package/docs/rules/require-jsdoc.md +1 -1
  93. package/docs/rules/require-param-description.md +116 -1694
  94. package/docs/rules/require-param-name.md +58 -133
  95. package/docs/rules/require-param-type.md +119 -55
  96. package/docs/rules/require-param.md +1700 -111
  97. package/docs/rules/require-property-description.md +39 -79
  98. package/docs/rules/require-property-name.md +21 -30
  99. package/docs/rules/require-property-type.md +21 -21
  100. package/docs/rules/require-property.md +82 -33
  101. package/docs/rules/require-returns-check.md +636 -747
  102. package/docs/rules/require-returns-description.md +61 -933
  103. package/docs/rules/require-returns-type.md +42 -79
  104. package/docs/rules/require-returns.md +1081 -61
  105. package/docs/rules/require-yields-check.md +238 -517
  106. package/docs/rules/require-yields.md +517 -238
  107. package/docs/rules/valid-types.md +1 -1
  108. package/docs/settings.md +1 -1
  109. package/package.json +5 -4
  110. package/tsconfig.json +2 -3
@@ -4,40 +4,39 @@ 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.TSTypeReference} ESTreeOrTypeScriptNode
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
15
  *
18
- * @param {ESTreeOrTypeScriptNode} node
19
- * @returns {boolean}
16
+ * @param {ESTreeOrTypeScriptNode|undefined|null} node
17
+ * @returns {boolean|undefined|null}
20
18
  */
21
19
  const isNewPromiseExpression = node => {
22
20
  return node && node.type === 'NewExpression' && node.callee.type === 'Identifier' && node.callee.name === 'Promise';
23
21
  };
24
22
 
25
23
  /**
26
- * @param {import('@typescript-eslint/types').TSESTree.TSTypeReference} node
24
+ * @param {ESTreeOrTypeScriptNode|null|undefined} node
27
25
  * @returns {boolean}
28
26
  */
29
27
  const isVoidPromise = node => {
30
28
  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';
29
+ 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'
30
+ );
32
31
  };
33
32
  const undefinedKeywords = new Set(['TSVoidKeyword', 'TSUndefinedKeyword', 'TSNeverKeyword']);
34
33
 
35
34
  /**
36
35
  * Checks if a node has a return statement. Void return does not count.
37
36
  *
38
- * @param {import('estree').Node|import('@typescript-eslint/types').TSESTree.Node} node
39
- * @param {boolean} throwOnNullReturn
40
- * @param {PromiseFilter} promFilter
37
+ * @param {ESTreeOrTypeScriptNode|undefined|null} node
38
+ * @param {boolean} [throwOnNullReturn]
39
+ * @param {PromiseFilter} [promFilter]
41
40
  * @returns {boolean|undefined}
42
41
  */
43
42
  // eslint-disable-next-line complexity
@@ -120,9 +119,9 @@ const hasReturnValue = (node, throwOnNullReturn, promFilter) => {
120
119
  /**
121
120
  * Checks if a node has a return statement. Void return does not count.
122
121
  *
123
- * @param {object} node
122
+ * @param {ESTreeOrTypeScriptNode|null|undefined} node
124
123
  * @param {PromiseFilter} promFilter
125
- * @returns {boolean|import('estree').Node}
124
+ * @returns {undefined|boolean|ESTreeOrTypeScriptNode}
126
125
  */
127
126
  // eslint-disable-next-line complexity
128
127
  exports.hasReturnValue = hasReturnValue;
@@ -146,7 +145,8 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
146
145
  case 'FunctionDeclaration':
147
146
  case 'ArrowFunctionExpression':
148
147
  {
149
- return node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) || allBrancheshaveReturnValues(node.body, promFilter) || node.body.body.some(nde => {
148
+ return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) || allBrancheshaveReturnValues(node.body, promFilter) || /** @type {import('@typescript-eslint/types').TSESTree.BlockStatement} */
149
+ node.body.body.some(nde => {
150
150
  return nde.type === 'ReturnStatement';
151
151
  });
152
152
  }
@@ -157,7 +157,11 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
157
157
  }
158
158
  case 'WhileStatement':
159
159
  case 'DoWhileStatement':
160
- if (node.test.value === true) {
160
+ if (
161
+ /**
162
+ * @type {import('@typescript-eslint/types').TSESTree.Literal}
163
+ */
164
+ node.test.value === true) {
161
165
  // If this is an infinite loop, we assume only one branch
162
166
  // is needed to provide a return
163
167
  return hasReturnValue(node.body, false, promFilter);
@@ -186,7 +190,7 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
186
190
  hasReturnValue(node.finalizer, true, promFilter);
187
191
  } catch (error) {
188
192
  // istanbul ignore else
189
- if (error.message === 'Null return') {
193
+ if ( /** @type {Error} */error.message === 'Null return') {
190
194
  return false;
191
195
  }
192
196
 
@@ -200,11 +204,12 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
200
204
  }
201
205
  case 'SwitchStatement':
202
206
  {
203
- return node.cases.every(someCase => {
204
- return !someCase.consequent.some(consNode => {
205
- return consNode.type === 'BreakStatement' || consNode.type === 'ReturnStatement' && consNode.argument === null;
206
- });
207
- });
207
+ return (/** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */node.cases.every(someCase => {
208
+ return !someCase.consequent.some(consNode => {
209
+ return consNode.type === 'BreakStatement' || consNode.type === 'ReturnStatement' && consNode.argument === null;
210
+ });
211
+ })
212
+ );
208
213
  }
209
214
  case 'ThrowStatement':
210
215
  {
@@ -232,7 +237,7 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
232
237
 
233
238
  /**
234
239
  * @callback PromiseFilter
235
- * @param {object} node
240
+ * @param {ESTreeOrTypeScriptNode|undefined} node
236
241
  * @returns {boolean}
237
242
  */
238
243
 
@@ -245,7 +250,7 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
245
250
  * unlikely, we avoid the performance cost of checking everywhere for
246
251
  * (re)declarations or assignments.
247
252
  *
248
- * @param {AST} node
253
+ * @param {import('@typescript-eslint/types').TSESTree.Node|null|undefined} node
249
254
  * @param {string} resolverName
250
255
  * @returns {boolean}
251
256
  */
@@ -257,17 +262,19 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
257
262
 
258
263
  // Arrow function without block
259
264
  switch (node.type) {
265
+ // @ts-expect-error Babel?
260
266
  // istanbul ignore next -- In Babel?
261
267
  case 'OptionalCallExpression':
262
268
  case 'CallExpression':
263
- return node.callee.name === resolverName && (
264
- // Implicit or explicit undefined
265
- node.arguments.length > 1 || node.arguments[0] !== undefined) || node.arguments.some(nde => {
266
- // Being passed in to another function (which might invoke it)
267
- return nde.type === 'Identifier' && nde.name === resolverName ||
268
- // Handle nested items
269
- hasNonEmptyResolverCall(nde, resolverName);
270
- });
269
+ return (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */node.callee.name === resolverName && (
270
+ // Implicit or explicit undefined
271
+ node.arguments.length > 1 || node.arguments[0] !== undefined) || node.arguments.some(nde => {
272
+ // Being passed in to another function (which might invoke it)
273
+ return nde.type === 'Identifier' && nde.name === resolverName ||
274
+ // Handle nested items
275
+ hasNonEmptyResolverCall(nde, resolverName);
276
+ })
277
+ );
271
278
  case 'ChainExpression':
272
279
  case 'Decorator':
273
280
  case 'ExpressionStatement':
@@ -283,7 +290,7 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
283
290
  {
284
291
  var _node$params$;
285
292
  // Shadowing
286
- if (((_node$params$ = node.params[0]) === null || _node$params$ === void 0 ? void 0 : _node$params$.name) === resolverName) {
293
+ 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
294
  return false;
288
295
  }
289
296
  return hasNonEmptyResolverCall(node.body, resolverName);
@@ -340,6 +347,7 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
340
347
  return node.properties.some(property => {
341
348
  return hasNonEmptyResolverCall(property, resolverName);
342
349
  });
350
+ // @ts-expect-error Babel?
343
351
  // istanbul ignore next -- In Babel?
344
352
  case 'ClassMethod':
345
353
  case 'MethodDefinition':
@@ -347,20 +355,26 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
347
355
  return hasNonEmptyResolverCall(decorator, resolverName);
348
356
  }) || node.computed && hasNonEmptyResolverCall(node.key, resolverName) || hasNonEmptyResolverCall(node.value, resolverName);
349
357
 
358
+ // @ts-expect-error Babel?
350
359
  // istanbul ignore next -- In Babel?
351
360
  case 'ObjectProperty':
352
361
  /* eslint-disable no-fallthrough */
353
362
  // istanbul ignore next -- In Babel?
354
363
  case 'PropertyDefinition':
364
+ // @ts-expect-error Babel?
355
365
  // istanbul ignore next -- In Babel?
356
366
  case 'ClassProperty':
357
367
  case 'Property':
358
368
  /* eslint-enable no-fallthrough */
359
369
  return node.computed && hasNonEmptyResolverCall(node.key, resolverName) || hasNonEmptyResolverCall(node.value, resolverName);
370
+ // @ts-expect-error Babel?
360
371
  // istanbul ignore next -- In Babel?
361
372
  case 'ObjectMethod':
373
+ // @ts-expect-error
362
374
  // istanbul ignore next -- In Babel?
363
- return node.computed && hasNonEmptyResolverCall(node.key, resolverName) || node.arguments.some(nde => {
375
+ return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
376
+ // @ts-expect-error
377
+ node.arguments.some(nde => {
364
378
  return hasNonEmptyResolverCall(nde, resolverName);
365
379
  });
366
380
  case 'ClassExpression':
@@ -384,12 +398,14 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
384
398
  case 'TaggedTemplateExpression':
385
399
  return hasNonEmptyResolverCall(node.quasi, resolverName);
386
400
 
401
+ // @ts-expect-error Babel?
387
402
  // ?.
388
403
  // istanbul ignore next -- In Babel?
389
404
  case 'OptionalMemberExpression':
390
405
  case 'MemberExpression':
391
406
  return hasNonEmptyResolverCall(node.object, resolverName) || hasNonEmptyResolverCall(node.property, resolverName);
392
407
 
408
+ // @ts-expect-error Babel?
393
409
  // istanbul ignore next -- In Babel?
394
410
  case 'Import':
395
411
  case 'ImportExpression':
@@ -418,19 +434,25 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
418
434
  * Checks if a Promise executor has no resolve value or an empty value.
419
435
  * An `undefined` resolve does not count.
420
436
  *
421
- * @param {object} node
437
+ * @param {ESTreeOrTypeScriptNode} node
422
438
  * @param {boolean} anyPromiseAsReturn
423
- * @param {boolean} allBranches
439
+ * @param {boolean} [allBranches]
424
440
  * @returns {boolean}
425
441
  */
426
442
  const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, allBranches) => {
427
- const hasReturnMethod = allBranches ? (nde, promiseFilter) => {
443
+ const hasReturnMethod = allBranches ?
444
+ /**
445
+ * @param {ESTreeOrTypeScriptNode} nde
446
+ * @param {PromiseFilter} promiseFilter
447
+ * @returns {boolean}
448
+ */
449
+ (nde, promiseFilter) => {
428
450
  let hasReturn;
429
451
  try {
430
452
  hasReturn = hasReturnValue(nde, true, promiseFilter);
431
453
  } catch (error) {
432
454
  // istanbul ignore else
433
- if (error.message === 'Null return') {
455
+ if ( /** @type {Error} */error.message === 'Null return') {
434
456
  return false;
435
457
  }
436
458
 
@@ -440,9 +462,15 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
440
462
 
441
463
  // `hasReturn` check needed since `throw` treated as valid return by
442
464
  // `allBrancheshaveReturnValues`
443
- return hasReturn && allBrancheshaveReturnValues(nde, promiseFilter);
444
- } : (nde, promiseFilter) => {
445
- return hasReturnValue(nde, false, promiseFilter);
465
+ return Boolean(hasReturn && allBrancheshaveReturnValues(nde, promiseFilter));
466
+ } :
467
+ /**
468
+ * @param {ESTreeOrTypeScriptNode} nde
469
+ * @param {PromiseFilter} promiseFilter
470
+ * @returns {boolean}
471
+ */
472
+ (nde, promiseFilter) => {
473
+ return Boolean(hasReturnValue(nde, false, promiseFilter));
446
474
  };
447
475
  return hasReturnMethod(node, prom => {
448
476
  if (anyPromiseAsReturn) {
@@ -451,16 +479,22 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
451
479
  if (isVoidPromise(prom)) {
452
480
  return false;
453
481
  }
454
- const [{
482
+ const {
455
483
  params,
456
484
  body
457
- } = {}] = prom.arguments;
485
+ } =
486
+ /**
487
+ * @type {import('@typescript-eslint/types').TSESTree.FunctionExpression|
488
+ * import('@typescript-eslint/types').TSESTree.ArrowFunctionExpression}
489
+ */
490
+ /** @type {import('@typescript-eslint/types').TSESTree.NewExpression} */prom.arguments[0] || {};
458
491
  if (!(params !== null && params !== void 0 && params.length)) {
459
492
  return false;
460
493
  }
461
- const [{
494
+ const {
462
495
  name: resolverName
463
- }] = params;
496
+ } = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */
497
+ params[0];
464
498
  return hasNonEmptyResolverCall(body, resolverName);
465
499
  });
466
500
  };
@@ -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 *\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 *\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 *\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 *\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 *\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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"}
@@ -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