eslint-plugin-jsdoc 50.6.17 → 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 +30 -30
  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
@@ -20,7 +20,8 @@ const isNewPromiseExpression = (node) => {
20
20
  */
21
21
  const isVoidPromise = (node) => {
22
22
  return /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (node)?.typeArguments?.params?.[0]?.type === 'TSVoidKeyword'
23
- /* c8 ignore next 4 */
23
+ /* c8 ignore next 5 */
24
+ // eslint-disable-next-line @stylistic/operator-linebreak -- c8
24
25
  || /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (
25
26
  node
26
27
  // @ts-expect-error Ok
@@ -28,7 +29,7 @@ const isVoidPromise = (node) => {
28
29
  };
29
30
 
30
31
  const undefinedKeywords = new Set([
31
- 'TSVoidKeyword', 'TSUndefinedKeyword', 'TSNeverKeyword',
32
+ 'TSNeverKeyword', 'TSUndefinedKeyword', 'TSVoidKeyword',
32
33
  ]);
33
34
 
34
35
  /**
@@ -45,83 +46,87 @@ const hasReturnValue = (node, throwOnNullReturn, promFilter) => {
45
46
  }
46
47
 
47
48
  switch (node.type) {
48
- case 'TSDeclareFunction':
49
- case 'TSFunctionType':
50
- case 'TSMethodSignature': {
51
- const type = node?.returnType?.typeAnnotation?.type;
52
- return type && !undefinedKeywords.has(type);
53
- }
54
-
55
- case 'MethodDefinition':
56
- return hasReturnValue(node.value, throwOnNullReturn, promFilter);
57
- case 'FunctionExpression':
58
- case 'FunctionDeclaration':
59
- case 'ArrowFunctionExpression': {
60
- return 'expression' in node && node.expression && (!isNewPromiseExpression(
61
- node.body,
62
- ) || !isVoidPromise(node.body)) ||
49
+ case 'ArrowFunctionExpression':
50
+ case 'FunctionDeclaration':
51
+ case 'FunctionExpression': {
52
+ return 'expression' in node && node.expression && (!isNewPromiseExpression(
53
+ node.body,
54
+ ) || !isVoidPromise(node.body)) ||
63
55
  hasReturnValue(node.body, throwOnNullReturn, promFilter);
64
- }
56
+ }
65
57
 
66
- case 'BlockStatement': {
67
- return node.body.some((bodyNode) => {
68
- return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode, throwOnNullReturn, promFilter);
69
- });
70
- }
58
+ case 'BlockStatement': {
59
+ return node.body.some((bodyNode) => {
60
+ return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode, throwOnNullReturn, promFilter);
61
+ });
62
+ }
71
63
 
72
- case 'LabeledStatement':
73
- case 'WhileStatement':
74
- case 'DoWhileStatement':
75
- case 'ForStatement':
76
- case 'ForInStatement':
77
- case 'ForOfStatement':
78
- case 'WithStatement': {
79
- return hasReturnValue(node.body, throwOnNullReturn, promFilter);
80
- }
64
+ case 'DoWhileStatement':
65
+ case 'ForInStatement':
66
+ case 'ForOfStatement':
81
67
 
82
- case 'IfStatement': {
83
- return hasReturnValue(node.consequent, throwOnNullReturn, promFilter) ||
84
- hasReturnValue(node.alternate, throwOnNullReturn, promFilter);
85
- }
68
+ case 'ForStatement':
86
69
 
87
- case 'TryStatement': {
88
- return hasReturnValue(node.block, throwOnNullReturn, promFilter) ||
89
- hasReturnValue(node.handler && node.handler.body, throwOnNullReturn, promFilter) ||
90
- hasReturnValue(node.finalizer, throwOnNullReturn, promFilter);
91
- }
70
+ case 'LabeledStatement':
71
+ case 'WhileStatement':
72
+ case 'WithStatement': {
73
+ return hasReturnValue(node.body, throwOnNullReturn, promFilter);
74
+ }
92
75
 
93
- case 'SwitchStatement': {
94
- return node.cases.some(
95
- (someCase) => {
96
- return someCase.consequent.some((nde) => {
97
- return hasReturnValue(nde, throwOnNullReturn, promFilter);
98
- });
99
- },
100
- );
101
- }
76
+ case 'IfStatement': {
77
+ return hasReturnValue(node.consequent, throwOnNullReturn, promFilter) ||
78
+ hasReturnValue(node.alternate, throwOnNullReturn, promFilter);
79
+ }
102
80
 
103
- case 'ReturnStatement': {
81
+ case 'MethodDefinition':
82
+ return hasReturnValue(node.value, throwOnNullReturn, promFilter);
83
+ case 'ReturnStatement': {
104
84
  // void return does not count.
105
- if (node.argument === null) {
106
- if (throwOnNullReturn) {
107
- throw new Error('Null return');
108
- }
85
+ if (node.argument === null) {
86
+ if (throwOnNullReturn) {
87
+ throw new Error('Null return');
88
+ }
109
89
 
110
- return false;
111
- }
90
+ return false;
91
+ }
112
92
 
113
- if (promFilter && isNewPromiseExpression(node.argument)) {
93
+ if (promFilter && isNewPromiseExpression(node.argument)) {
114
94
  // Let caller decide how to filter, but this is, at the least,
115
95
  // a return of sorts and truthy
116
- return promFilter(node.argument);
96
+ return promFilter(node.argument);
97
+ }
98
+
99
+ return true;
117
100
  }
118
101
 
119
- return true;
120
- }
102
+ case 'SwitchStatement': {
103
+ return node.cases.some(
104
+ (someCase) => {
105
+ return someCase.consequent.some((nde) => {
106
+ return hasReturnValue(nde, throwOnNullReturn, promFilter);
107
+ });
108
+ },
109
+ );
110
+ }
121
111
 
122
- default: {
123
- return false;
124
- }
112
+ case 'TryStatement': {
113
+ return hasReturnValue(node.block, throwOnNullReturn, promFilter) ||
114
+ hasReturnValue(node.handler && node.handler.body, throwOnNullReturn, promFilter) ||
115
+ hasReturnValue(node.finalizer, throwOnNullReturn, promFilter);
116
+ }
117
+
118
+ case 'TSDeclareFunction':
119
+
120
+ case 'TSFunctionType':
121
+
122
+ case 'TSMethodSignature': {
123
+ const type = node?.returnType?.typeAnnotation?.type;
124
+ return type && !undefinedKeywords.has(type);
125
+ }
126
+
127
+ default: {
128
+ return false;
129
+ }
125
130
  }
126
131
  };
127
132
 
@@ -138,66 +143,92 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
138
143
  }
139
144
 
140
145
  switch (node.type) {
141
- case 'TSDeclareFunction':
142
- case 'TSFunctionType':
143
- case 'TSMethodSignature': {
144
- const type = node?.returnType?.typeAnnotation?.type;
145
- return type && !undefinedKeywords.has(type);
146
- }
147
-
148
- // case 'MethodDefinition':
149
- // return allBrancheshaveReturnValues(node.value, promFilter);
150
- case 'FunctionExpression':
151
- case 'FunctionDeclaration':
152
- case 'ArrowFunctionExpression': {
153
- return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) ||
146
+ // case 'MethodDefinition':
147
+ // return allBrancheshaveReturnValues(node.value, promFilter);
148
+ case 'ArrowFunctionExpression':
149
+ case 'FunctionDeclaration':
150
+ case 'FunctionExpression': {
151
+ return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) ||
154
152
  allBrancheshaveReturnValues(node.body, promFilter) ||
155
153
  /** @type {import('@typescript-eslint/types').TSESTree.BlockStatement} */
156
154
  (node.body).body.some((nde) => {
157
155
  return nde.type === 'ReturnStatement';
158
156
  });
159
- }
157
+ }
160
158
 
161
- case 'BlockStatement': {
162
- const lastBodyNode = node.body.slice(-1)[0];
163
- return allBrancheshaveReturnValues(lastBodyNode, promFilter);
164
- }
159
+ case 'BlockStatement': {
160
+ const lastBodyNode = node.body.slice(-1)[0];
161
+ return allBrancheshaveReturnValues(lastBodyNode, promFilter);
162
+ }
165
163
 
166
- case 'WhileStatement':
167
- case 'DoWhileStatement':
168
- if (
164
+ case 'DoWhileStatement':
165
+ case 'WhileStatement':
166
+ if (
169
167
  /**
170
168
  * @type {import('@typescript-eslint/types').TSESTree.Literal}
171
169
  */
172
- (node.test).value === true
173
- ) {
170
+ (node.test).value === true
171
+ ) {
174
172
  // If this is an infinite loop, we assume only one branch
175
173
  // is needed to provide a return
176
- return hasReturnValue(node.body, false, promFilter);
177
- }
174
+ return hasReturnValue(node.body, false, promFilter);
175
+ }
178
176
 
179
177
  // Fallthrough
180
- case 'ForStatement':
181
- if (node.test === null) {
178
+ case 'ForStatement':
179
+ if (node.test === null) {
182
180
  // If this is an infinite loop, we assume only one branch
183
181
  // is needed to provide a return
184
- return hasReturnValue(node.body, false, promFilter);
182
+ return hasReturnValue(node.body, false, promFilter);
183
+ }
184
+
185
+ case 'ForInStatement':
186
+ case 'ForOfStatement':
187
+
188
+ case 'LabeledStatement':
189
+
190
+ case 'WithStatement': {
191
+ return allBrancheshaveReturnValues(node.body, promFilter);
185
192
  }
186
- case 'LabeledStatement':
187
- case 'ForInStatement':
188
- case 'ForOfStatement':
189
- case 'WithStatement': {
190
- return allBrancheshaveReturnValues(node.body, promFilter);
191
- }
192
193
 
193
- case 'IfStatement': {
194
- return allBrancheshaveReturnValues(node.consequent, promFilter) &&
194
+ case 'IfStatement': {
195
+ return allBrancheshaveReturnValues(node.consequent, promFilter) &&
195
196
  allBrancheshaveReturnValues(node.alternate, promFilter);
196
- }
197
+ }
197
198
 
198
- case 'TryStatement': {
199
+ case 'ReturnStatement': {
200
+ // void return does not count.
201
+ if (node.argument === null) {
202
+ return false;
203
+ }
204
+
205
+ if (promFilter && isNewPromiseExpression(node.argument)) {
206
+ // Let caller decide how to filter, but this is, at the least,
207
+ // a return of sorts and truthy
208
+ return promFilter(node.argument);
209
+ }
210
+
211
+ return true;
212
+ }
213
+
214
+ case 'SwitchStatement': {
215
+ return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */ (node).cases.every(
216
+ (someCase) => {
217
+ return !someCase.consequent.some((consNode) => {
218
+ return consNode.type === 'BreakStatement' ||
219
+ consNode.type === 'ReturnStatement' && consNode.argument === null;
220
+ });
221
+ },
222
+ );
223
+ }
224
+
225
+ case 'ThrowStatement': {
226
+ return true;
227
+ }
228
+
229
+ case 'TryStatement': {
199
230
  // If `finally` returns, all return
200
- return node.finalizer && allBrancheshaveReturnValues(node.finalizer, promFilter) ||
231
+ return node.finalizer && allBrancheshaveReturnValues(node.finalizer, promFilter) ||
201
232
  // Return in `try`/`catch` may still occur despite `finally`
202
233
  allBrancheshaveReturnValues(node.block, promFilter) &&
203
234
  (!node.handler ||
@@ -209,48 +240,28 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
209
240
  if (/** @type {Error} */ (error).message === 'Null return') {
210
241
  return false;
211
242
  }
212
- /* c8 ignore next 2 */
243
+ /* c8 ignore next 3 */
244
+ // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
213
245
  throw error;
214
246
  }
215
247
 
216
248
  // As long as not an explicit empty return, then return true
217
249
  return true;
218
250
  })());
219
- }
251
+ }
220
252
 
221
- case 'SwitchStatement': {
222
- return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */ (node).cases.every(
223
- (someCase) => {
224
- return !someCase.consequent.some((consNode) => {
225
- return consNode.type === 'BreakStatement' ||
226
- consNode.type === 'ReturnStatement' && consNode.argument === null;
227
- });
228
- },
229
- );
230
- }
253
+ case 'TSDeclareFunction':
231
254
 
232
- case 'ThrowStatement': {
233
- return true;
234
- }
255
+ case 'TSFunctionType':
235
256
 
236
- case 'ReturnStatement': {
237
- // void return does not count.
238
- if (node.argument === null) {
239
- return false;
257
+ case 'TSMethodSignature': {
258
+ const type = node?.returnType?.typeAnnotation?.type;
259
+ return type && !undefinedKeywords.has(type);
240
260
  }
241
261
 
242
- if (promFilter && isNewPromiseExpression(node.argument)) {
243
- // Let caller decide how to filter, but this is, at the least,
244
- // a return of sorts and truthy
245
- return promFilter(node.argument);
262
+ default: {
263
+ return false;
246
264
  }
247
-
248
- return true;
249
- }
250
-
251
- default: {
252
- return false;
253
- }
254
265
  }
255
266
  };
256
267
 
@@ -280,17 +291,55 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
280
291
 
281
292
  // Arrow function without block
282
293
  switch (node.type) {
283
- /* c8 ignore next 2 -- In Babel? */
284
- // @ts-expect-error Babel?
285
- case 'OptionalCallExpression':
286
- case 'CallExpression':
287
- return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
288
- node.callee
289
- ).name === resolverName && (
294
+ case 'ArrayExpression':
295
+ case 'ArrayPattern':
296
+ return node.elements.some((element) => {
297
+ return hasNonEmptyResolverCall(element, resolverName);
298
+ });
299
+ case 'ArrowFunctionExpression':
300
+ case 'FunctionDeclaration':
301
+ case 'FunctionExpression': {
302
+ // Shadowing
303
+ if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
304
+ node.params[0]
305
+ )?.name === resolverName) {
306
+ return false;
307
+ }
308
+
309
+ return hasNonEmptyResolverCall(node.body, resolverName);
310
+ }
311
+
312
+ case 'AssignmentExpression':
313
+ case 'BinaryExpression':
314
+ case 'LogicalExpression': {
315
+ return hasNonEmptyResolverCall(node.left, resolverName) ||
316
+ hasNonEmptyResolverCall(node.right, resolverName);
317
+ }
318
+
319
+ case 'AssignmentPattern':
320
+ return hasNonEmptyResolverCall(node.right, resolverName);
321
+ case 'AwaitExpression':
322
+
323
+ case 'SpreadElement':
324
+ case 'UnaryExpression':
325
+ case 'YieldExpression':
326
+ return hasNonEmptyResolverCall(node.argument, resolverName);
327
+ case 'BlockStatement':
328
+ case 'ClassBody':
329
+ return node.body.some((bodyNode) => {
330
+ return hasNonEmptyResolverCall(bodyNode, resolverName);
331
+ });
332
+ /* c8 ignore next 2 -- In Babel? */
333
+ case 'CallExpression':
334
+ // @ts-expect-error Babel?
335
+ case 'OptionalCallExpression':
336
+ return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
337
+ node.callee
338
+ ).name === resolverName && (
290
339
 
291
340
  // Implicit or explicit undefined
292
- node.arguments.length > 1 || node.arguments[0] !== undefined
293
- ) ||
341
+ node.arguments.length > 1 || node.arguments[0] !== undefined
342
+ ) ||
294
343
  node.arguments.some((nde) => {
295
344
  // Being passed in to another function (which might invoke it)
296
345
  return nde.type === 'Identifier' && nde.name === resolverName ||
@@ -298,170 +347,135 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
298
347
  // Handle nested items
299
348
  hasNonEmptyResolverCall(nde, resolverName);
300
349
  });
301
- case 'ChainExpression':
302
- case 'Decorator':
303
- case 'ExpressionStatement':
304
- return hasNonEmptyResolverCall(node.expression, resolverName);
305
- case 'ClassBody':
306
- case 'BlockStatement':
307
- return node.body.some((bodyNode) => {
308
- return hasNonEmptyResolverCall(bodyNode, resolverName);
309
- });
310
- case 'FunctionExpression':
311
- case 'FunctionDeclaration':
312
- case 'ArrowFunctionExpression': {
313
- // Shadowing
314
- if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
315
- node.params[0]
316
- )?.name === resolverName) {
317
- return false;
318
- }
319
350
 
320
- return hasNonEmptyResolverCall(node.body, resolverName);
321
- }
351
+ case 'ChainExpression':
352
+ case 'Decorator':
322
353
 
323
- case 'LabeledStatement':
324
- case 'WhileStatement':
325
- case 'DoWhileStatement':
326
- case 'ForStatement':
327
- case 'ForInStatement':
328
- case 'ForOfStatement':
329
- case 'WithStatement': {
330
- return hasNonEmptyResolverCall(node.body, resolverName);
331
- }
354
+ case 'ExpressionStatement':
355
+ return hasNonEmptyResolverCall(node.expression, resolverName);
332
356
 
333
- case 'ConditionalExpression':
334
- case 'IfStatement': {
335
- return hasNonEmptyResolverCall(node.test, resolverName) ||
336
- hasNonEmptyResolverCall(node.consequent, resolverName) ||
337
- hasNonEmptyResolverCall(node.alternate, resolverName);
338
- }
357
+ case 'ClassDeclaration':
339
358
 
340
- case 'TryStatement': {
341
- return hasNonEmptyResolverCall(node.block, resolverName) ||
342
- hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) ||
343
- hasNonEmptyResolverCall(node.finalizer, resolverName);
344
- }
359
+ case 'ClassExpression':
360
+ return hasNonEmptyResolverCall(node.body, resolverName);
361
+ /* c8 ignore next 2 -- In Babel? */
362
+ // @ts-expect-error Babel?
363
+ case 'ClassMethod':
345
364
 
346
- case 'SwitchStatement': {
347
- return node.cases.some(
348
- (someCase) => {
349
- return someCase.consequent.some((nde) => {
350
- return hasNonEmptyResolverCall(nde, resolverName);
351
- });
352
- },
353
- );
354
- }
365
+ case 'MethodDefinition':
366
+ return node.decorators && node.decorators.some((decorator) => {
367
+ return hasNonEmptyResolverCall(decorator, resolverName);
368
+ }) ||
369
+ node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
370
+ hasNonEmptyResolverCall(node.value, resolverName);
355
371
 
356
- case 'ArrayPattern':
357
- case 'ArrayExpression':
358
- return node.elements.some((element) => {
359
- return hasNonEmptyResolverCall(element, resolverName);
360
- });
372
+ /* c8 ignore next 2 -- In Babel? */
373
+ // @ts-expect-error Babel?
374
+ case 'ClassProperty':
375
+ /* c8 ignore next 2 -- In Babel? */
376
+ // @ts-expect-error Babel?
377
+ case 'ObjectProperty':
378
+ case 'Property':
361
379
 
362
- case 'AssignmentPattern':
363
- return hasNonEmptyResolverCall(node.right, resolverName);
380
+ case 'PropertyDefinition':
381
+ return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
382
+ hasNonEmptyResolverCall(node.value, resolverName);
383
+ case 'ConditionalExpression':
364
384
 
365
- case 'AssignmentExpression':
366
- case 'BinaryExpression':
367
- case 'LogicalExpression': {
368
- return hasNonEmptyResolverCall(node.left, resolverName) ||
369
- hasNonEmptyResolverCall(node.right, resolverName);
370
- }
385
+ case 'IfStatement': {
386
+ return hasNonEmptyResolverCall(node.test, resolverName) ||
387
+ hasNonEmptyResolverCall(node.consequent, resolverName) ||
388
+ hasNonEmptyResolverCall(node.alternate, resolverName);
389
+ }
371
390
 
372
- // Comma
373
- case 'SequenceExpression':
374
- case 'TemplateLiteral':
375
- return node.expressions.some((subExpression) => {
376
- return hasNonEmptyResolverCall(subExpression, resolverName);
377
- });
378
-
379
- case 'ObjectPattern':
380
- case 'ObjectExpression':
381
- return node.properties.some((property) => {
382
- return hasNonEmptyResolverCall(property, resolverName);
383
- });
384
- /* c8 ignore next 2 -- In Babel? */
385
- // @ts-expect-error Babel?
386
- case 'ClassMethod':
387
- case 'MethodDefinition':
388
- return node.decorators && node.decorators.some((decorator) => {
389
- return hasNonEmptyResolverCall(decorator, resolverName);
390
- }) ||
391
- node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
392
- hasNonEmptyResolverCall(node.value, resolverName);
391
+ case 'DoWhileStatement':
392
+ case 'ForInStatement':
393
+ case 'ForOfStatement':
393
394
 
394
- /* c8 ignore next 2 -- In Babel? */
395
- // @ts-expect-error Babel?
396
- case 'ObjectProperty':
397
- /* eslint-disable no-fallthrough */
398
- /* c8 ignore next -- In Babel? */
399
- case 'PropertyDefinition':
400
- /* c8 ignore next 2 -- In Babel? */
401
- // @ts-expect-error Babel?
402
- case 'ClassProperty':
403
- case 'Property':
404
- /* eslint-enable no-fallthrough */
405
- return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
406
- hasNonEmptyResolverCall(node.value, resolverName);
407
- /* c8 ignore next 2 -- In Babel? */
408
- // @ts-expect-error Babel?
409
- case 'ObjectMethod':
395
+ case 'ForStatement':
396
+ case 'LabeledStatement':
397
+ case 'WhileStatement':
398
+ case 'WithStatement': {
399
+ return hasNonEmptyResolverCall(node.body, resolverName);
400
+ }
401
+
402
+ /* c8 ignore next 2 -- In Babel? */
403
+ // @ts-expect-error Babel?
404
+ case 'Import':
405
+
406
+ case 'ImportExpression':
407
+ return hasNonEmptyResolverCall(node.source, resolverName);
408
+ // ?.
409
+ /* c8 ignore next 2 -- In Babel? */
410
+ case 'MemberExpression':
411
+
412
+ // @ts-expect-error Babel?
413
+ case 'OptionalMemberExpression':
414
+ return hasNonEmptyResolverCall(node.object, resolverName) ||
415
+ hasNonEmptyResolverCall(node.property, resolverName);
416
+ case 'ObjectExpression':
417
+ case 'ObjectPattern':
418
+ return node.properties.some((property) => {
419
+ return hasNonEmptyResolverCall(property, resolverName);
420
+ });
421
+ /* c8 ignore next 2 -- In Babel? */
422
+ // @ts-expect-error Babel?
423
+ case 'ObjectMethod':
410
424
  /* c8 ignore next 6 -- In Babel? */
411
425
  // @ts-expect-error
412
- return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
426
+ return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
413
427
  // @ts-expect-error
414
428
  node.arguments.some((nde) => {
415
429
  return hasNonEmptyResolverCall(nde, resolverName);
416
430
  });
417
431
 
418
- case 'ClassExpression':
419
- case 'ClassDeclaration':
420
- return hasNonEmptyResolverCall(node.body, resolverName);
432
+ case 'ReturnStatement': {
433
+ if (node.argument === null) {
434
+ return false;
435
+ }
421
436
 
422
- case 'AwaitExpression':
423
- case 'SpreadElement':
424
- case 'UnaryExpression':
425
- case 'YieldExpression':
426
- return hasNonEmptyResolverCall(node.argument, resolverName);
437
+ return hasNonEmptyResolverCall(node.argument, resolverName);
438
+ }
427
439
 
428
- case 'VariableDeclaration': {
429
- return node.declarations.some((nde) => {
430
- return hasNonEmptyResolverCall(nde, resolverName);
431
- });
432
- }
440
+ // Comma
441
+ case 'SequenceExpression':
433
442
 
434
- case 'VariableDeclarator': {
435
- return hasNonEmptyResolverCall(node.id, resolverName) ||
436
- hasNonEmptyResolverCall(node.init, resolverName);
437
- }
443
+ case 'TemplateLiteral':
444
+ return node.expressions.some((subExpression) => {
445
+ return hasNonEmptyResolverCall(subExpression, resolverName);
446
+ });
438
447
 
439
- case 'TaggedTemplateExpression':
440
- return hasNonEmptyResolverCall(node.quasi, resolverName);
448
+ case 'SwitchStatement': {
449
+ return node.cases.some(
450
+ (someCase) => {
451
+ return someCase.consequent.some((nde) => {
452
+ return hasNonEmptyResolverCall(nde, resolverName);
453
+ });
454
+ },
455
+ );
456
+ }
441
457
 
442
- // ?.
443
- /* c8 ignore next 2 -- In Babel? */
444
- // @ts-expect-error Babel?
445
- case 'OptionalMemberExpression':
446
- case 'MemberExpression':
447
- return hasNonEmptyResolverCall(node.object, resolverName) ||
448
- hasNonEmptyResolverCall(node.property, resolverName);
458
+ case 'TaggedTemplateExpression':
459
+ return hasNonEmptyResolverCall(node.quasi, resolverName);
449
460
 
450
- /* c8 ignore next 2 -- In Babel? */
451
- // @ts-expect-error Babel?
452
- case 'Import':
453
- case 'ImportExpression':
454
- return hasNonEmptyResolverCall(node.source, resolverName);
461
+ case 'TryStatement': {
462
+ return hasNonEmptyResolverCall(node.block, resolverName) ||
463
+ hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) ||
464
+ hasNonEmptyResolverCall(node.finalizer, resolverName);
465
+ }
455
466
 
456
- case 'ReturnStatement': {
457
- if (node.argument === null) {
458
- return false;
467
+ case 'VariableDeclaration': {
468
+ return node.declarations.some((nde) => {
469
+ return hasNonEmptyResolverCall(nde, resolverName);
470
+ });
459
471
  }
460
472
 
461
- return hasNonEmptyResolverCall(node.argument, resolverName);
462
- }
473
+ case 'VariableDeclarator': {
474
+ return hasNonEmptyResolverCall(node.id, resolverName) ||
475
+ hasNonEmptyResolverCall(node.init, resolverName);
476
+ }
463
477
 
464
- /*
478
+ /*
465
479
  // Shouldn't need to parse literals/literal components, etc.
466
480
 
467
481
  case 'Identifier':
@@ -469,8 +483,8 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
469
483
  case 'Super':
470
484
  // Exports not relevant in this context
471
485
  */
472
- default:
473
- return false;
486
+ default:
487
+ return false;
474
488
  }
475
489
  };
476
490
 
@@ -498,7 +512,8 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
498
512
  if (/** @type {Error} */ (error).message === 'Null return') {
499
513
  return false;
500
514
  }
501
- /* c8 ignore next 2 */
515
+ /* c8 ignore next 3 */
516
+ // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
502
517
  throw error;
503
518
  }
504
519
 
@@ -525,8 +540,8 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
525
540
  }
526
541
 
527
542
  const {
528
- params,
529
543
  body,
544
+ params,
530
545
  } =
531
546
  /**
532
547
  * @type {import('@typescript-eslint/types').TSESTree.FunctionExpression|