eslint-plugin-jsdoc 50.6.16 → 50.7.0

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 (155) hide show
  1. package/dist/alignTransform.cjs +10 -10
  2. package/dist/alignTransform.cjs.map +1 -1
  3. package/dist/exportParser.cjs +141 -135
  4. package/dist/exportParser.cjs.map +1 -1
  5. package/dist/generateRule.cjs +10 -12
  6. package/dist/generateRule.cjs.map +1 -1
  7. package/dist/getDefaultTagStructureForMode.cjs +73 -73
  8. package/dist/getDefaultTagStructureForMode.cjs.map +1 -1
  9. package/dist/getJsdocProcessorPlugin.cjs +121 -110
  10. package/dist/getJsdocProcessorPlugin.cjs.map +1 -1
  11. package/dist/index.cjs +17 -12
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.ts +4 -3
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/iterateJsdoc.cjs +87 -66
  16. package/dist/iterateJsdoc.cjs.map +1 -1
  17. package/dist/jsdocUtils.cjs +144 -142
  18. package/dist/jsdocUtils.cjs.map +1 -1
  19. package/dist/rules/checkAlignment.cjs +2 -2
  20. package/dist/rules/checkAlignment.cjs.map +1 -1
  21. package/dist/rules/checkExamples.cjs +22 -28
  22. package/dist/rules/checkExamples.cjs.map +1 -1
  23. package/dist/rules/checkIndentation.cjs +2 -2
  24. package/dist/rules/checkIndentation.cjs.map +1 -1
  25. package/dist/rules/checkLineAlignment.cjs +14 -14
  26. package/dist/rules/checkLineAlignment.cjs.map +1 -1
  27. package/dist/rules/checkParamNames.cjs +21 -15
  28. package/dist/rules/checkParamNames.cjs.map +1 -1
  29. package/dist/rules/checkPropertyNames.cjs +2 -2
  30. package/dist/rules/checkPropertyNames.cjs.map +1 -1
  31. package/dist/rules/checkTagNames.cjs +11 -11
  32. package/dist/rules/checkTagNames.cjs.map +1 -1
  33. package/dist/rules/checkTemplateNames.cjs +21 -22
  34. package/dist/rules/checkTemplateNames.cjs.map +1 -1
  35. package/dist/rules/checkTypes.cjs +10 -10
  36. package/dist/rules/checkTypes.cjs.map +1 -1
  37. package/dist/rules/checkValues.cjs +11 -14
  38. package/dist/rules/checkValues.cjs.map +1 -1
  39. package/dist/rules/convertToJsdocComments.cjs +26 -27
  40. package/dist/rules/convertToJsdocComments.cjs.map +1 -1
  41. package/dist/rules/emptyTags.cjs +6 -6
  42. package/dist/rules/emptyTags.cjs.map +1 -1
  43. package/dist/rules/importsAsDependencies.cjs.map +1 -1
  44. package/dist/rules/informativeDocs.cjs +12 -12
  45. package/dist/rules/informativeDocs.cjs.map +1 -1
  46. package/dist/rules/linesBeforeBlock.cjs +12 -12
  47. package/dist/rules/linesBeforeBlock.cjs.map +1 -1
  48. package/dist/rules/matchDescription.cjs +1 -1
  49. package/dist/rules/matchDescription.cjs.map +1 -1
  50. package/dist/rules/matchName.cjs +4 -4
  51. package/dist/rules/matchName.cjs.map +1 -1
  52. package/dist/rules/multilineBlocks.cjs +10 -10
  53. package/dist/rules/multilineBlocks.cjs.map +1 -1
  54. package/dist/rules/noBadBlocks.cjs +3 -3
  55. package/dist/rules/noBadBlocks.cjs.map +1 -1
  56. package/dist/rules/noMultiAsterisks.cjs +6 -6
  57. package/dist/rules/noMultiAsterisks.cjs.map +1 -1
  58. package/dist/rules/noRestrictedSyntax.cjs +2 -2
  59. package/dist/rules/noRestrictedSyntax.cjs.map +1 -1
  60. package/dist/rules/noTypes.cjs.map +1 -1
  61. package/dist/rules/noUndefinedTypes.cjs +17 -20
  62. package/dist/rules/noUndefinedTypes.cjs.map +1 -1
  63. package/dist/rules/requireAsteriskPrefix.cjs +4 -4
  64. package/dist/rules/requireAsteriskPrefix.cjs.map +1 -1
  65. package/dist/rules/requireDescription.cjs +2 -2
  66. package/dist/rules/requireDescription.cjs.map +1 -1
  67. package/dist/rules/requireDescriptionCompleteSentence.cjs +8 -8
  68. package/dist/rules/requireDescriptionCompleteSentence.cjs.map +1 -1
  69. package/dist/rules/requireFileOverview.cjs +6 -6
  70. package/dist/rules/requireFileOverview.cjs.map +1 -1
  71. package/dist/rules/requireHyphenBeforeParamDescription.cjs +1 -4
  72. package/dist/rules/requireHyphenBeforeParamDescription.cjs.map +1 -1
  73. package/dist/rules/requireJsdoc.cjs +19 -19
  74. package/dist/rules/requireJsdoc.cjs.map +1 -1
  75. package/dist/rules/requireParam.cjs +12 -12
  76. package/dist/rules/requireParam.cjs.map +1 -1
  77. package/dist/rules/requireProperty.cjs +1 -1
  78. package/dist/rules/requireProperty.cjs.map +1 -1
  79. package/dist/rules/requireReturns.cjs +3 -3
  80. package/dist/rules/requireReturns.cjs.map +1 -1
  81. package/dist/rules/requireReturnsCheck.cjs +1 -1
  82. package/dist/rules/requireReturnsCheck.cjs.map +1 -1
  83. package/dist/rules/requireReturnsDescription.cjs +1 -1
  84. package/dist/rules/requireReturnsDescription.cjs.map +1 -1
  85. package/dist/rules/requireTemplate.cjs +16 -15
  86. package/dist/rules/requireTemplate.cjs.map +1 -1
  87. package/dist/rules/requireYields.cjs +4 -4
  88. package/dist/rules/requireYields.cjs.map +1 -1
  89. package/dist/rules/requireYieldsCheck.cjs +6 -6
  90. package/dist/rules/requireYieldsCheck.cjs.map +1 -1
  91. package/dist/rules/sortTags.cjs +13 -13
  92. package/dist/rules/sortTags.cjs.map +1 -1
  93. package/dist/rules/tagLines.cjs +11 -11
  94. package/dist/rules/tagLines.cjs.map +1 -1
  95. package/dist/rules/textEscaping.cjs +2 -2
  96. package/dist/rules/textEscaping.cjs.map +1 -1
  97. package/dist/rules/validTypes.cjs +15 -15
  98. package/dist/rules/validTypes.cjs.map +1 -1
  99. package/dist/tagNames.cjs +1 -1
  100. package/dist/tagNames.cjs.map +1 -1
  101. package/dist/utils/hasReturnValue.cjs +176 -176
  102. package/dist/utils/hasReturnValue.cjs.map +1 -1
  103. package/eslint.config.js +36 -32
  104. package/package.json +35 -35
  105. package/pnpm-workspace.yaml +1 -0
  106. package/src/alignTransform.js +15 -15
  107. package/src/exportParser.js +386 -373
  108. package/src/getDefaultTagStructureForMode.js +45 -45
  109. package/src/getJsdocProcessorPlugin.js +175 -128
  110. package/src/index.js +66 -37
  111. package/src/iterateJsdoc.js +61 -28
  112. package/src/jsdocUtils.js +354 -338
  113. package/src/rules/checkAlignment.js +2 -2
  114. package/src/rules/checkExamples.js +16 -20
  115. package/src/rules/checkIndentation.js +2 -2
  116. package/src/rules/checkLineAlignment.js +10 -10
  117. package/src/rules/checkParamNames.js +22 -14
  118. package/src/rules/checkPropertyNames.js +1 -1
  119. package/src/rules/checkTagNames.js +7 -7
  120. package/src/rules/checkTemplateNames.js +52 -38
  121. package/src/rules/checkTypes.js +7 -7
  122. package/src/rules/checkValues.js +16 -17
  123. package/src/rules/convertToJsdocComments.js +47 -37
  124. package/src/rules/emptyTags.js +14 -7
  125. package/src/rules/importsAsDependencies.js +3 -1
  126. package/src/rules/informativeDocs.js +58 -58
  127. package/src/rules/linesBeforeBlock.js +25 -17
  128. package/src/rules/matchDescription.js +1 -1
  129. package/src/rules/matchName.js +2 -2
  130. package/src/rules/multilineBlocks.js +10 -10
  131. package/src/rules/noBadBlocks.js +3 -3
  132. package/src/rules/noMultiAsterisks.js +4 -4
  133. package/src/rules/noRestrictedSyntax.js +1 -1
  134. package/src/rules/noTypes.js +1 -1
  135. package/src/rules/noUndefinedTypes.js +29 -23
  136. package/src/rules/requireAsteriskPrefix.js +3 -3
  137. package/src/rules/requireDescription.js +1 -1
  138. package/src/rules/requireDescriptionCompleteSentence.js +6 -6
  139. package/src/rules/requireFileOverview.js +3 -3
  140. package/src/rules/requireHyphenBeforeParamDescription.js +2 -5
  141. package/src/rules/requireJsdoc.js +14 -14
  142. package/src/rules/requireParam.js +9 -9
  143. package/src/rules/requireProperty.js +1 -1
  144. package/src/rules/requireReturns.js +1 -1
  145. package/src/rules/requireReturnsCheck.js +1 -1
  146. package/src/rules/requireReturnsDescription.js +1 -1
  147. package/src/rules/requireTemplate.js +59 -38
  148. package/src/rules/requireYields.js +3 -3
  149. package/src/rules/requireYieldsCheck.js +1 -1
  150. package/src/rules/sortTags.js +7 -7
  151. package/src/rules/tagLines.js +8 -8
  152. package/src/rules/textEscaping.js +2 -0
  153. package/src/rules/validTypes.js +29 -29
  154. package/src/tagNames.js +2 -2
  155. package/src/utils/hasReturnValue.js +298 -283
@@ -26,7 +26,9 @@ const isNewPromiseExpression = node => {
26
26
  const isVoidPromise = node => {
27
27
  var _node$typeArguments, _node$typeParameters;
28
28
  return /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */(node === null || node === void 0 || (_node$typeArguments = node.typeArguments) === null || _node$typeArguments === void 0 || (_node$typeArguments = _node$typeArguments.params) === null || _node$typeArguments === void 0 || (_node$typeArguments = _node$typeArguments[0]) === null || _node$typeArguments === void 0 ? void 0 : _node$typeArguments.type) === 'TSVoidKeyword'
29
- /* c8 ignore next 4 */ || /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */(node
29
+ /* c8 ignore next 5 */
30
+ // eslint-disable-next-line @stylistic/operator-linebreak -- c8
31
+ || /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */(node
30
32
  // @ts-expect-error Ok
31
33
  === null || node
32
34
  // @ts-expect-error Ok
@@ -34,7 +36,7 @@ const isVoidPromise = node => {
34
36
  // @ts-expect-error Ok
35
37
  .typeParameters) === null || _node$typeParameters === void 0 || (_node$typeParameters = _node$typeParameters.params) === null || _node$typeParameters === void 0 || (_node$typeParameters = _node$typeParameters[0]) === null || _node$typeParameters === void 0 ? void 0 : _node$typeParameters.type) === 'TSVoidKeyword';
36
38
  };
37
- const undefinedKeywords = new Set(['TSVoidKeyword', 'TSUndefinedKeyword', 'TSNeverKeyword']);
39
+ const undefinedKeywords = new Set(['TSNeverKeyword', 'TSUndefinedKeyword', 'TSVoidKeyword']);
38
40
 
39
41
  /**
40
42
  * Checks if a node has a return statement. Void return does not count.
@@ -49,19 +51,9 @@ const hasReturnValue = (node, throwOnNullReturn, promFilter) => {
49
51
  return false;
50
52
  }
51
53
  switch (node.type) {
52
- case 'TSDeclareFunction':
53
- case 'TSFunctionType':
54
- case 'TSMethodSignature':
55
- {
56
- var _node$returnType;
57
- const type = node === null || node === void 0 || (_node$returnType = node.returnType) === null || _node$returnType === void 0 || (_node$returnType = _node$returnType.typeAnnotation) === null || _node$returnType === void 0 ? void 0 : _node$returnType.type;
58
- return type && !undefinedKeywords.has(type);
59
- }
60
- case 'MethodDefinition':
61
- return hasReturnValue(node.value, throwOnNullReturn, promFilter);
62
- case 'FunctionExpression':
63
- case 'FunctionDeclaration':
64
54
  case 'ArrowFunctionExpression':
55
+ case 'FunctionDeclaration':
56
+ case 'FunctionExpression':
65
57
  {
66
58
  return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) || hasReturnValue(node.body, throwOnNullReturn, promFilter);
67
59
  }
@@ -71,12 +63,12 @@ const hasReturnValue = (node, throwOnNullReturn, promFilter) => {
71
63
  return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode, throwOnNullReturn, promFilter);
72
64
  });
73
65
  }
74
- case 'LabeledStatement':
75
- case 'WhileStatement':
76
66
  case 'DoWhileStatement':
77
- case 'ForStatement':
78
67
  case 'ForInStatement':
79
68
  case 'ForOfStatement':
69
+ case 'ForStatement':
70
+ case 'LabeledStatement':
71
+ case 'WhileStatement':
80
72
  case 'WithStatement':
81
73
  {
82
74
  return hasReturnValue(node.body, throwOnNullReturn, promFilter);
@@ -85,18 +77,8 @@ const hasReturnValue = (node, throwOnNullReturn, promFilter) => {
85
77
  {
86
78
  return hasReturnValue(node.consequent, throwOnNullReturn, promFilter) || hasReturnValue(node.alternate, throwOnNullReturn, promFilter);
87
79
  }
88
- case 'TryStatement':
89
- {
90
- return hasReturnValue(node.block, throwOnNullReturn, promFilter) || hasReturnValue(node.handler && node.handler.body, throwOnNullReturn, promFilter) || hasReturnValue(node.finalizer, throwOnNullReturn, promFilter);
91
- }
92
- case 'SwitchStatement':
93
- {
94
- return node.cases.some(someCase => {
95
- return someCase.consequent.some(nde => {
96
- return hasReturnValue(nde, throwOnNullReturn, promFilter);
97
- });
98
- });
99
- }
80
+ case 'MethodDefinition':
81
+ return hasReturnValue(node.value, throwOnNullReturn, promFilter);
100
82
  case 'ReturnStatement':
101
83
  {
102
84
  // void return does not count.
@@ -113,6 +95,26 @@ const hasReturnValue = (node, throwOnNullReturn, promFilter) => {
113
95
  }
114
96
  return true;
115
97
  }
98
+ case 'SwitchStatement':
99
+ {
100
+ return node.cases.some(someCase => {
101
+ return someCase.consequent.some(nde => {
102
+ return hasReturnValue(nde, throwOnNullReturn, promFilter);
103
+ });
104
+ });
105
+ }
106
+ case 'TryStatement':
107
+ {
108
+ return hasReturnValue(node.block, throwOnNullReturn, promFilter) || hasReturnValue(node.handler && node.handler.body, throwOnNullReturn, promFilter) || hasReturnValue(node.finalizer, throwOnNullReturn, promFilter);
109
+ }
110
+ case 'TSDeclareFunction':
111
+ case 'TSFunctionType':
112
+ case 'TSMethodSignature':
113
+ {
114
+ var _node$returnType;
115
+ const type = node === null || node === void 0 || (_node$returnType = node.returnType) === null || _node$returnType === void 0 || (_node$returnType = _node$returnType.typeAnnotation) === null || _node$returnType === void 0 ? void 0 : _node$returnType.type;
116
+ return type && !undefinedKeywords.has(type);
117
+ }
116
118
  default:
117
119
  {
118
120
  return false;
@@ -133,20 +135,11 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
133
135
  return false;
134
136
  }
135
137
  switch (node.type) {
136
- case 'TSDeclareFunction':
137
- case 'TSFunctionType':
138
- case 'TSMethodSignature':
139
- {
140
- var _node$returnType2;
141
- const type = node === null || node === void 0 || (_node$returnType2 = node.returnType) === null || _node$returnType2 === void 0 || (_node$returnType2 = _node$returnType2.typeAnnotation) === null || _node$returnType2 === void 0 ? void 0 : _node$returnType2.type;
142
- return type && !undefinedKeywords.has(type);
143
- }
144
-
145
138
  // case 'MethodDefinition':
146
139
  // return allBrancheshaveReturnValues(node.value, promFilter);
147
- case 'FunctionExpression':
148
- case 'FunctionDeclaration':
149
140
  case 'ArrowFunctionExpression':
141
+ case 'FunctionDeclaration':
142
+ case 'FunctionExpression':
150
143
  {
151
144
  return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) || allBrancheshaveReturnValues(node.body, promFilter) || /** @type {import('@typescript-eslint/types').TSESTree.BlockStatement} */
152
145
  node.body.body.some(nde => {
@@ -158,8 +151,8 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
158
151
  const lastBodyNode = node.body.slice(-1)[0];
159
152
  return allBrancheshaveReturnValues(lastBodyNode, promFilter);
160
153
  }
161
- case 'WhileStatement':
162
154
  case 'DoWhileStatement':
155
+ case 'WhileStatement':
163
156
  if (
164
157
  /**
165
158
  * @type {import('@typescript-eslint/types').TSESTree.Literal}
@@ -177,9 +170,9 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
177
170
  // is needed to provide a return
178
171
  return hasReturnValue(node.body, false, promFilter);
179
172
  }
180
- case 'LabeledStatement':
181
173
  case 'ForInStatement':
182
174
  case 'ForOfStatement':
175
+ case 'LabeledStatement':
183
176
  case 'WithStatement':
184
177
  {
185
178
  return allBrancheshaveReturnValues(node.body, promFilter);
@@ -188,6 +181,31 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
188
181
  {
189
182
  return allBrancheshaveReturnValues(node.consequent, promFilter) && allBrancheshaveReturnValues(node.alternate, promFilter);
190
183
  }
184
+ case 'ReturnStatement':
185
+ {
186
+ // void return does not count.
187
+ if (node.argument === null) {
188
+ return false;
189
+ }
190
+ if (promFilter && isNewPromiseExpression(node.argument)) {
191
+ // Let caller decide how to filter, but this is, at the least,
192
+ // a return of sorts and truthy
193
+ return promFilter(node.argument);
194
+ }
195
+ return true;
196
+ }
197
+ case 'SwitchStatement':
198
+ {
199
+ return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */node.cases.every(someCase => {
200
+ return !someCase.consequent.some(consNode => {
201
+ return consNode.type === 'BreakStatement' || consNode.type === 'ReturnStatement' && consNode.argument === null;
202
+ });
203
+ });
204
+ }
205
+ case 'ThrowStatement':
206
+ {
207
+ return true;
208
+ }
191
209
  case 'TryStatement':
192
210
  {
193
211
  // If `finally` returns, all return
@@ -197,10 +215,11 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
197
215
  try {
198
216
  hasReturnValue(node.finalizer, true, promFilter);
199
217
  } catch (error) {
200
- if ( /** @type {Error} */error.message === 'Null return') {
218
+ if (/** @type {Error} */error.message === 'Null return') {
201
219
  return false;
202
220
  }
203
- /* c8 ignore next 2 */
221
+ /* c8 ignore next 3 */
222
+ // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
204
223
  throw error;
205
224
  }
206
225
 
@@ -208,30 +227,13 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
208
227
  return true;
209
228
  })());
210
229
  }
211
- case 'SwitchStatement':
212
- {
213
- return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */node.cases.every(someCase => {
214
- return !someCase.consequent.some(consNode => {
215
- return consNode.type === 'BreakStatement' || consNode.type === 'ReturnStatement' && consNode.argument === null;
216
- });
217
- });
218
- }
219
- case 'ThrowStatement':
220
- {
221
- return true;
222
- }
223
- case 'ReturnStatement':
230
+ case 'TSDeclareFunction':
231
+ case 'TSFunctionType':
232
+ case 'TSMethodSignature':
224
233
  {
225
- // void return does not count.
226
- if (node.argument === null) {
227
- return false;
228
- }
229
- if (promFilter && isNewPromiseExpression(node.argument)) {
230
- // Let caller decide how to filter, but this is, at the least,
231
- // a return of sorts and truthy
232
- return promFilter(node.argument);
233
- }
234
- return true;
234
+ var _node$returnType2;
235
+ const type = node === null || node === void 0 || (_node$returnType2 = node.returnType) === null || _node$returnType2 === void 0 || (_node$returnType2 = _node$returnType2.typeAnnotation) === null || _node$returnType2 === void 0 ? void 0 : _node$returnType2.type;
236
+ return type && !undefinedKeywords.has(type);
235
237
  }
236
238
  default:
237
239
  {
@@ -266,90 +268,59 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
266
268
 
267
269
  // Arrow function without block
268
270
  switch (node.type) {
269
- /* c8 ignore next 2 -- In Babel? */
270
- // @ts-expect-error Babel?
271
- case 'OptionalCallExpression':
272
- case 'CallExpression':
273
- return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */node.callee.name === resolverName && (
274
- // Implicit or explicit undefined
275
- node.arguments.length > 1 || node.arguments[0] !== undefined) || node.arguments.some(nde => {
276
- // Being passed in to another function (which might invoke it)
277
- return nde.type === 'Identifier' && nde.name === resolverName ||
278
- // Handle nested items
279
- hasNonEmptyResolverCall(nde, resolverName);
280
- });
281
- case 'ChainExpression':
282
- case 'Decorator':
283
- case 'ExpressionStatement':
284
- return hasNonEmptyResolverCall(node.expression, resolverName);
285
- case 'ClassBody':
286
- case 'BlockStatement':
287
- return node.body.some(bodyNode => {
288
- return hasNonEmptyResolverCall(bodyNode, resolverName);
271
+ case 'ArrayExpression':
272
+ case 'ArrayPattern':
273
+ return node.elements.some(element => {
274
+ return hasNonEmptyResolverCall(element, resolverName);
289
275
  });
290
- case 'FunctionExpression':
291
- case 'FunctionDeclaration':
292
276
  case 'ArrowFunctionExpression':
277
+ case 'FunctionDeclaration':
278
+ case 'FunctionExpression':
293
279
  {
294
280
  var _node$params$;
295
281
  // Shadowing
296
- if ( /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */((_node$params$ = node.params[0]) === null || _node$params$ === void 0 ? void 0 : _node$params$.name) === resolverName) {
282
+ if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */((_node$params$ = node.params[0]) === null || _node$params$ === void 0 ? void 0 : _node$params$.name) === resolverName) {
297
283
  return false;
298
284
  }
299
285
  return hasNonEmptyResolverCall(node.body, resolverName);
300
286
  }
301
- case 'LabeledStatement':
302
- case 'WhileStatement':
303
- case 'DoWhileStatement':
304
- case 'ForStatement':
305
- case 'ForInStatement':
306
- case 'ForOfStatement':
307
- case 'WithStatement':
308
- {
309
- return hasNonEmptyResolverCall(node.body, resolverName);
310
- }
311
- case 'ConditionalExpression':
312
- case 'IfStatement':
313
- {
314
- return hasNonEmptyResolverCall(node.test, resolverName) || hasNonEmptyResolverCall(node.consequent, resolverName) || hasNonEmptyResolverCall(node.alternate, resolverName);
315
- }
316
- case 'TryStatement':
317
- {
318
- return hasNonEmptyResolverCall(node.block, resolverName) || hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) || hasNonEmptyResolverCall(node.finalizer, resolverName);
319
- }
320
- case 'SwitchStatement':
321
- {
322
- return node.cases.some(someCase => {
323
- return someCase.consequent.some(nde => {
324
- return hasNonEmptyResolverCall(nde, resolverName);
325
- });
326
- });
327
- }
328
- case 'ArrayPattern':
329
- case 'ArrayExpression':
330
- return node.elements.some(element => {
331
- return hasNonEmptyResolverCall(element, resolverName);
332
- });
333
- case 'AssignmentPattern':
334
- return hasNonEmptyResolverCall(node.right, resolverName);
335
287
  case 'AssignmentExpression':
336
288
  case 'BinaryExpression':
337
289
  case 'LogicalExpression':
338
290
  {
339
291
  return hasNonEmptyResolverCall(node.left, resolverName) || hasNonEmptyResolverCall(node.right, resolverName);
340
292
  }
341
-
342
- // Comma
343
- case 'SequenceExpression':
344
- case 'TemplateLiteral':
345
- return node.expressions.some(subExpression => {
346
- return hasNonEmptyResolverCall(subExpression, resolverName);
293
+ case 'AssignmentPattern':
294
+ return hasNonEmptyResolverCall(node.right, resolverName);
295
+ case 'AwaitExpression':
296
+ case 'SpreadElement':
297
+ case 'UnaryExpression':
298
+ case 'YieldExpression':
299
+ return hasNonEmptyResolverCall(node.argument, resolverName);
300
+ case 'BlockStatement':
301
+ case 'ClassBody':
302
+ return node.body.some(bodyNode => {
303
+ return hasNonEmptyResolverCall(bodyNode, resolverName);
347
304
  });
348
- case 'ObjectPattern':
349
- case 'ObjectExpression':
350
- return node.properties.some(property => {
351
- return hasNonEmptyResolverCall(property, resolverName);
305
+ /* c8 ignore next 2 -- In Babel? */
306
+ case 'CallExpression':
307
+ // @ts-expect-error Babel?
308
+ case 'OptionalCallExpression':
309
+ return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */node.callee.name === resolverName && (
310
+ // Implicit or explicit undefined
311
+ node.arguments.length > 1 || node.arguments[0] !== undefined) || node.arguments.some(nde => {
312
+ // Being passed in to another function (which might invoke it)
313
+ return nde.type === 'Identifier' && nde.name === resolverName ||
314
+ // Handle nested items
315
+ hasNonEmptyResolverCall(nde, resolverName);
352
316
  });
317
+ case 'ChainExpression':
318
+ case 'Decorator':
319
+ case 'ExpressionStatement':
320
+ return hasNonEmptyResolverCall(node.expression, resolverName);
321
+ case 'ClassDeclaration':
322
+ case 'ClassExpression':
323
+ return hasNonEmptyResolverCall(node.body, resolverName);
353
324
  /* c8 ignore next 2 -- In Babel? */
354
325
  // @ts-expect-error Babel?
355
326
  case 'ClassMethod':
@@ -360,16 +331,46 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
360
331
 
361
332
  /* c8 ignore next 2 -- In Babel? */
362
333
  // @ts-expect-error Babel?
363
- case 'ObjectProperty':
364
- /* eslint-disable no-fallthrough */
365
- /* c8 ignore next -- In Babel? */
366
- case 'PropertyDefinition':
334
+ case 'ClassProperty':
367
335
  /* c8 ignore next 2 -- In Babel? */
368
336
  // @ts-expect-error Babel?
369
- case 'ClassProperty':
337
+ case 'ObjectProperty':
370
338
  case 'Property':
371
- /* eslint-enable no-fallthrough */
339
+ case 'PropertyDefinition':
372
340
  return node.computed && hasNonEmptyResolverCall(node.key, resolverName) || hasNonEmptyResolverCall(node.value, resolverName);
341
+ case 'ConditionalExpression':
342
+ case 'IfStatement':
343
+ {
344
+ return hasNonEmptyResolverCall(node.test, resolverName) || hasNonEmptyResolverCall(node.consequent, resolverName) || hasNonEmptyResolverCall(node.alternate, resolverName);
345
+ }
346
+ case 'DoWhileStatement':
347
+ case 'ForInStatement':
348
+ case 'ForOfStatement':
349
+ case 'ForStatement':
350
+ case 'LabeledStatement':
351
+ case 'WhileStatement':
352
+ case 'WithStatement':
353
+ {
354
+ return hasNonEmptyResolverCall(node.body, resolverName);
355
+ }
356
+
357
+ /* c8 ignore next 2 -- In Babel? */
358
+ // @ts-expect-error Babel?
359
+ case 'Import':
360
+ case 'ImportExpression':
361
+ return hasNonEmptyResolverCall(node.source, resolverName);
362
+ // ?.
363
+ /* c8 ignore next 2 -- In Babel? */
364
+ case 'MemberExpression':
365
+
366
+ // @ts-expect-error Babel?
367
+ case 'OptionalMemberExpression':
368
+ return hasNonEmptyResolverCall(node.object, resolverName) || hasNonEmptyResolverCall(node.property, resolverName);
369
+ case 'ObjectExpression':
370
+ case 'ObjectPattern':
371
+ return node.properties.some(property => {
372
+ return hasNonEmptyResolverCall(property, resolverName);
373
+ });
373
374
  /* c8 ignore next 2 -- In Babel? */
374
375
  // @ts-expect-error Babel?
375
376
  case 'ObjectMethod':
@@ -380,14 +381,34 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
380
381
  node.arguments.some(nde => {
381
382
  return hasNonEmptyResolverCall(nde, resolverName);
382
383
  });
383
- case 'ClassExpression':
384
- case 'ClassDeclaration':
385
- return hasNonEmptyResolverCall(node.body, resolverName);
386
- case 'AwaitExpression':
387
- case 'SpreadElement':
388
- case 'UnaryExpression':
389
- case 'YieldExpression':
390
- return hasNonEmptyResolverCall(node.argument, resolverName);
384
+ case 'ReturnStatement':
385
+ {
386
+ if (node.argument === null) {
387
+ return false;
388
+ }
389
+ return hasNonEmptyResolverCall(node.argument, resolverName);
390
+ }
391
+
392
+ // Comma
393
+ case 'SequenceExpression':
394
+ case 'TemplateLiteral':
395
+ return node.expressions.some(subExpression => {
396
+ return hasNonEmptyResolverCall(subExpression, resolverName);
397
+ });
398
+ case 'SwitchStatement':
399
+ {
400
+ return node.cases.some(someCase => {
401
+ return someCase.consequent.some(nde => {
402
+ return hasNonEmptyResolverCall(nde, resolverName);
403
+ });
404
+ });
405
+ }
406
+ case 'TaggedTemplateExpression':
407
+ return hasNonEmptyResolverCall(node.quasi, resolverName);
408
+ case 'TryStatement':
409
+ {
410
+ return hasNonEmptyResolverCall(node.block, resolverName) || hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) || hasNonEmptyResolverCall(node.finalizer, resolverName);
411
+ }
391
412
  case 'VariableDeclaration':
392
413
  {
393
414
  return node.declarations.some(nde => {
@@ -398,32 +419,10 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
398
419
  {
399
420
  return hasNonEmptyResolverCall(node.id, resolverName) || hasNonEmptyResolverCall(node.init, resolverName);
400
421
  }
401
- case 'TaggedTemplateExpression':
402
- return hasNonEmptyResolverCall(node.quasi, resolverName);
403
-
404
- // ?.
405
- /* c8 ignore next 2 -- In Babel? */
406
- // @ts-expect-error Babel?
407
- case 'OptionalMemberExpression':
408
- case 'MemberExpression':
409
- return hasNonEmptyResolverCall(node.object, resolverName) || hasNonEmptyResolverCall(node.property, resolverName);
410
-
411
- /* c8 ignore next 2 -- In Babel? */
412
- // @ts-expect-error Babel?
413
- case 'Import':
414
- case 'ImportExpression':
415
- return hasNonEmptyResolverCall(node.source, resolverName);
416
- case 'ReturnStatement':
417
- {
418
- if (node.argument === null) {
419
- return false;
420
- }
421
- return hasNonEmptyResolverCall(node.argument, resolverName);
422
- }
423
422
 
424
423
  /*
425
424
  // Shouldn't need to parse literals/literal components, etc.
426
- case 'Identifier':
425
+ case 'Identifier':
427
426
  case 'TemplateElement':
428
427
  case 'Super':
429
428
  // Exports not relevant in this context
@@ -454,10 +453,11 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
454
453
  hasReturn = hasReturnValue(nde, true, promiseFilter);
455
454
  } catch (error) {
456
455
  // c8 ignore else
457
- if ( /** @type {Error} */error.message === 'Null return') {
456
+ if (/** @type {Error} */error.message === 'Null return') {
458
457
  return false;
459
458
  }
460
- /* c8 ignore next 2 */
459
+ /* c8 ignore next 3 */
460
+ // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
461
461
  throw error;
462
462
  }
463
463
 
@@ -481,14 +481,14 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
481
481
  return false;
482
482
  }
483
483
  const {
484
- params,
485
- body
484
+ body,
485
+ params
486
486
  } =
487
487
  /**
488
488
  * @type {import('@typescript-eslint/types').TSESTree.FunctionExpression|
489
489
  * import('@typescript-eslint/types').TSESTree.ArrowFunctionExpression}
490
490
  */
491
- ( /** @type {import('@typescript-eslint/types').TSESTree.NewExpression} */prom.arguments[0]) || {};
491
+ (/** @type {import('@typescript-eslint/types').TSESTree.NewExpression} */prom.arguments[0]) || {};
492
492
  if (!(params !== null && params !== void 0 && params.length)) {
493
493
  return false;
494
494
  }